无法读取未定义的属性(mongoDB,node.js)

问题描述 投票:0回答:1

我按如下所示初始化连接:

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的概念,但是我认为我的某个地方存在错误,但我无法弄清楚。我还认为这可能与我对异步/等待的理解有关。任何帮助将不胜感激。

node.js mongodb async-await docker-compose database-connection
1个回答
0
投票

关于异步/等待-您不应像在callbacks中那样混合async/awaitcreateXY()。您可以简单地删除回调并按如下方式处理它:

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 ]以便自动创建。

© www.soinside.com 2019 - 2024. All rights reserved.