我有一个集群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()
,所以我认为它是连接的。
我的问题是,捕获量在哪里?使用群集的事实是否与猫鼬或我初始化它的方式相混淆?
由于
答案 0 :(得分:0)
好的,所以我发现了这个问题,它与我组织集群的方式无关,也没有与自己做错。
我正在将群集App设置为自己的package.json,并且出于某种原因,它使用的是主应用程序' mongoose'包。所以我删除了“猫鼬”#39;在package.json集群中输入,一切正常......
我仍然不知道为什么它会打破mongoose(双重导入?)。