【问题标题】:Cannot read property of undefined (mongoDB, node.js)无法读取未定义的属性(mongoDB、node.js)
【发布时间】:2020-06-10 16:25:16
【问题描述】:

我初始化连接如下:

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

【问题讨论】:

    标签: node.js mongodb async-await docker-compose database-connection


    【解决方案1】:

    关于 async/await - 你不应该像在 createXY() 中那样混用 callbacksasync/await。您可以简单地删除回调并按如下方式处理它:

    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-@ 987654321@ 以便自动创建它。

    【讨论】:

      猜你喜欢
      • 2019-07-28
      • 2019-12-01
      • 2016-05-09
      • 2021-12-05
      • 2020-05-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多