Moongose未连接到群集节点中的数据库

时间:2018-02-21 08:33:30

标签: node.js mongoose node-cluster

我有一个集群nodejs app(1个Master和4个Worker)的设置。

主人实例化工人并创建他们可以抓取的一堆任务。

每个工作人员都会启动这样的数据库连接:

import Database from './db';

//Worker
class Worker {
  constructor(process) {
    this.process = process;
    this.id = process.pid;

    this.db = new Database();
    console.log('[Worker][', this.id, '][Init] Ready');

    this.process.on('message', this.onMessage.bind(this));
  }

  onMessage(msg) {
     this.task = msg.task;
     new Task(this.task, this.db);
  }
}

我的数据库类看起来像这样:

import mongoose from 'mongoose';
import bluebird from 'bluebird';
import config from '../server/config/config.json';
import MyModel from '../server/model/mymodel';

class Database {
    constructor() {
        this.db = config.db;
        this.connect();
    }

    connect() {
        mongoose.Promise = bluebird;

        mongoose
            .connect(this.db.uri, {
                user: this.db.user,
                pass: this.db.pass,
                auth: {
                    authdb: this.db.authdb
                },
                promiseLibrary: bluebird,
                autoIndex: true,
                reconnectTries: Number.MAX_VALUE,
                reconnectInterval: 500,
                poolSize: 10,
                bufferMaxEntries: 0
            })
            .then(() => {
                console.log('connected');
            })
            .catch(err => {
                console.log(err);
                );
            });
    }

    async save(prices) {
        if (prices) {
            try {
                let bulkUpdate = MyModel.collection.initializeUnorderedBulkOp();
                //bulkUpdate is UNDEFINED !!!

                prices.forEach(price => {
                    bulkUpdate
                        .find({ price: price })
                        .upsert()
                        .updateOne(price);
                });

                await bulkUpdate.execute();
            } catch (err) {
                console.log(err);
            }
        }
        else {
            console.log('[Worker] No prices provided to save.');
        }
    }
}

我的任务类:

class Task {
    constructor(url, db) {
        this.url = url;
        this.db = db;
    }

    onDataReceived(prices) {
        if (prices) {
            try {
                this.db.save(prices);
            }
            catch (err) {
                console.log('Could not save data.');
                console.log(err);
            }
        }
        else {
            console.log('No data received');
            return;
        }
    }
}

当我执行代码时,bulkUpdate变量在initializeUnorderedBulkOp()之后未定义,因此我无法在其上执行.find()

经过一些研究,似乎moongose可能尚未连接。问题是我在执行console.log('connected');之前有控制台日志initializeUnorderedBulkOp(),所以我认为它是连接的。

我的问题是,捕获量在哪里?使用群集的事实是否与猫鼬或我初始化它的方式相混淆?

由于

1 个答案:

答案 0 :(得分:0)

好的,所以我发现了这个问题,它与我组织集群的方式无关,也没有与自己做错。

我正在将群集App设置为自己的package.json,并且出于某种原因,它使用的是主应用程序' mongoose'包。所以我删除了“猫鼬”#39;在package.json集群中输入,一切正常......

我仍然不知道为什么它会打破mongoose(双重导入?)。