我按如下所示初始化连接:
const {MongoClient} = require('mongodb').MongoClient;
let uri;
if(process.env.NODE_ENV === 'prod'){
console.log("running in prod");
uri = 'mongodb://[IP-Adress]:27017/';
} else {
console.log("running in dev");
uri = 'mongodb://localhost:27017/';
}
let isConnectionInitialized = false;
let client;
async function initializeConnection() {
client = await MongoClient.connect(uri);
isConnectionInitialized = true;
}
现在,当我这样调用'insertOne()'时:
async function createXY(param1, param2, param3) {
if(!isConnectionInitialized){await initializeConnection();}
await client.db('xy').collection('xy').insertOne({
param1: param1,
param2: param2,
param3: param3
}, function (err) {
if (err) throw err;
return param1;
});
return 0;
}
它在localhost上有效(并且仍然有效),但是在已部署的版本上存在错误。我从docker-compose的日志中收到以下消息:
UnhandledPromiseRejectionWarning:TypeError:无法读取未定义的属性'insertOne'
现在,我不确定我是否完全理解连接到mongoDB的概念,但是我认为我的某个地方存在错误,但我无法弄清楚。我还认为这可能与我对异步/等待的理解有关。任何帮助将不胜感激。
关于异步/等待-您不应像在callbacks
中那样混合async/await
和createXY()
。您可以简单地删除回调并按如下方式处理它:
async function createXY(param1, param2, param3) {
if (!isConnectionInitialized) {
await initializeConnection();
}
await client.db('xy').collection('xy').insertOne({
param1: param1,
param2: param2,
param3: param3
});
}
关于未定义的collection
-如果代码在您的本地计算机上运行良好,则可能是该集合在您的生产服务器上尚不存在,并且MongoDB用户没有所需的createCollection
-[C0 ]以便自动创建。