开发nodejs电影cms系统②:定时任务,视频源数据,初始化数据

nodejs定时任务一直是个让人头疼的问题,我在做之前就已经看到过很多人发问题问到pm2部署项目以后,多线程的问题下,

如何关闭定时任务,

或者任务被多个线程同时执行

这类问题。

pm2部署无法关闭任务(后台)

pm2部署无法关闭任务是因为,用户(管理员)开启定时任务的时候,可能被pm2分发到了B线程(假设电脑6核心12线程),你:我电脑就双核哪来的六核心?

不好意思,我的12线程。

扯远了,扯回来。

当用户(管理员)想关闭的时候pm2可能把任务分发到了G线程上了,但是G线程上并没有执行这个任务,就会报错。

定时任务被多个线程同时执行?

那是因为这个定时任务是项目部署开启服务的时候就设置好了,到了时间,pm2复制多份任务执行(一毛一样),当然就会重复跑任务。

怎么避免合适?

试想一下,如果我们项目用pm2部署,复制了12份node项目。但是我们可以使用别的进程守护工具,例如forever(单份,单线程)守护定时任务。

说人话:就是分两个项目部署,定时任务使用一个单线程守护工具,守护。这样,定时任务到时间以后就是单线程跑了,不会多线程同时调用。随之而来的一个问题,怎么通讯??pm2那边的服务怎么通知forever这边守护的的进程开启关闭任务。(http服务啊)

假设pm2守护的项目监听的是8888端口,我们forever这边的js开启的http服务可以监听9999。两者之间通讯就发post请求。(因为本机的原因。所以很快,秒收到)这样,通讯的问题解决,就可以随时动态的创建/删除 定时任务了。也不会出现多线程同时执行的问题。

视频源录入(后台)

上一章说了,视频数据录入格式。播放源如何录入,长啥样?

和留言关联视频表,关联用户表一样。视频源的数据也需要单独出来,因为如果不单独出来,我们只是查询一下电影列表,不需要展示播放源列表的时候,没有必要无端带出来那么多的数据

同样使用mongodb管道联表操作就可以很容易关联出源的数据。

初始化数据(后台)

可能刚入坑nodejs的cxk没懂,简称就是项目初始化默认就必须有的数据,比如博客总得有个默认的后台系统的root用户吧,默认的顶级分类,一些默认的配置,从哪来??肯定不会天上掉下来。

nodejs pakcage。json的script字段用于定义一些命令。前端的肯定知道,npm run dev,npm run build这些你肯定常用

你完全可以再script定义你的初始化数据命令。比如我

"scripts": {    "build": "node ./build/initDataBase.js",    "restore": "mongorestore -d movie ./backup/movie",    "backup": "mongodump -d movie -o ./backup/movie"}

build用于连接数据库,删除原有的数据库,创建全新的数据库,创建字段索引,并向数据库中插入默认的数据,比如电影cms系统的默认管理员信息。初始化的数据

const mongodb = require('mongodb'),MongoClient = mongodb.MongoClient,config = require('../utils/config.js'),dbConfig = config.project;let connectURL = 'mongodb://127.0.0.1:27017';let client = MongoClient.connect(connectURL, { useNewUrlParser: true, useUnifiedTopology: true });client.then(async (db) => {    let DB = db.db(dbConfig.dbName);    await new Promise(async (resolve, reject) => {        console.log('正在清除原始数据表');        await DB.dropCollection('session1').catch(err => {});        await DB.dropCollection('session2').catch(err => {});        await DB.dropCollection('config').catch(err => {});        await DB.dropCollection('logs').catch(err => {});        await DB.dropCollection('message').catch(err => {});        await DB.dropCollection('other').catch(err => {});        await DB.dropCollection('user').catch(err => {});        await DB.dropCollection('video_info').catch(err => {});        await DB.dropCollection('video_list').catch(err => {});        resolve()    })    .then(() => {        console.log('原始数据表清除完成');    })    .catch(err => {        console.log('+++', err);    })   

    await new Promise(async (resolve, reject) => {        console.log('开始重建数据表');        await DB.createCollection('session1');        await DB.createCollection('session2');        await DB.createCollection('config');        await DB.createCollection('logs');        await DB.createCollection('message');        await DB.createCollection('other');        await DB.createCollection('user');        await DB.createCollection('video_info');        await DB.createCollection('video_list');        resolve()    })    .then(() => {        console.log('数据表重建完成');    })    await new Promise(async (resolve, reject) => {        console.log('开始创建用户数据');        // 用户字段索引        let userColl =  DB.collection('user');        // 索引字段        await userColl.createIndexes([            {key:{userName: 1}},            {key:{passWord: 1}},            {key:{display: 1}},            {key:{admin: 1}},            {key:{grade_id: 1}},            {key:{default: 1}}        ]);        await userColl.insertOne({            userName: 'root',            passWord: 'e10adc3949ba59abbe56e057f20f883e',  // 123456 md5            nickName: '网站所有者',            admin: true,            display: true,            default: true,            grade_id: 2,                                  // 0用户 1管理员 2root用户        });        resolve();    })    .then(res=>{        console.log('用户数据创建成功');    })});


演示地址:https://www.youletv.com

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,045评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,114评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,120评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,902评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,828评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,132评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,590评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,258评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,408评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,335评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,385评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,068评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,660评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,747评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,967评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,406评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,970评论 2 341

推荐阅读更多精彩内容

  • # 模块机制 node采用模块化结构,按照CommonJS规范定义和使用模块,模块与文件是一一对应关系,即加载一个...
    RichRand阅读 2,477评论 0 3
  • 从一个同步式编程风格迁移到Node平台(在Node架构中,持续传递风格和异步接口是常用方式),将是一件令人受挫...
    宫若石阅读 415评论 0 0
  • 弄懂js异步 讲异步之前,我们必须掌握一个基础知识-event-loop。 我们知道JavaScript的一大特点...
    DCbryant阅读 2,690评论 0 5
  • 事件循环Event Loop JavaScript语言的一大特点就是单线程,作为脚本语言,避免复杂性。因为如果是多...
    ERICOOLU阅读 378评论 0 1
  • 《好好学习》 一、学习的内容: 临界知识.即:即通用知识.万能公式.具有广泛应用和基本规律的知识. 二:如何去学三...
    笔尖上的理性阅读 395评论 0 1