Mongoose 未连接到集群节点中的数据库
Moongose not connecting to DB in a cluster node
我有一个带有集群 nodejs 应用程序的设置(1 个主程序和 4 个工作程序)。
master 实例化 workers 并创建一堆他们可以抓取的任务。
每个工作人员都像这样启动一个数据库连接:
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);
}
}
我的数据库 class 看起来像这样:
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:
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 可能尚未连接。问题是我在执行 initializeUnorderedBulkOp()
之前有控制台日志 console.log('connected');
,所以我认为它已连接。
我的问题是,问题在哪里?使用集群的事实是否会混淆 mongoose 或我初始化它的方式?
谢谢
好的,所以我发现了问题,它与我组织集群的方式或 mongoose 本身无关。
我正在将集群应用程序设置为它自己的 package.json,并且出于某种原因它正在使用主应用程序 'mongoose' 包。所以我删除了集群 package.json 中的 'mongoose' 条目,一切正常...
我仍然不知道为什么它会破坏 mongoose(双重导入?)。
我有一个带有集群 nodejs 应用程序的设置(1 个主程序和 4 个工作程序)。
master 实例化 workers 并创建一堆他们可以抓取的任务。
每个工作人员都像这样启动一个数据库连接:
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);
}
}
我的数据库 class 看起来像这样:
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:
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 可能尚未连接。问题是我在执行 initializeUnorderedBulkOp()
之前有控制台日志 console.log('connected');
,所以我认为它已连接。
我的问题是,问题在哪里?使用集群的事实是否会混淆 mongoose 或我初始化它的方式?
谢谢
好的,所以我发现了问题,它与我组织集群的方式或 mongoose 本身无关。
我正在将集群应用程序设置为它自己的 package.json,并且出于某种原因它正在使用主应用程序 'mongoose' 包。所以我删除了集群 package.json 中的 'mongoose' 条目,一切正常...
我仍然不知道为什么它会破坏 mongoose(双重导入?)。