Nodejs Mongodb无法读取未定义的属性“then”

时间:2021-04-03 12:45:27

标签: node.js mongodb

我正在使用 NodeJs 和 MongoDB(没有猫鼬)并且我想要:

  • 检查集合是否存在。
  • 如果没有,则创建集合。
  • 等待创建过程结束。
  • 做收集的事情。
  mongoClient.connect(serverUrl, { useUnifiedTopology: true }, function (err, client) {
        if (err) { throw err};
        var db = client.db(useDB);

        db.collection(data.to).countDocuments({}, function (err, names) {
            if (names == 0) {
            db.collection(data.to).insertOne(defaultCollec);
            return console.log('Created:'+data.to)
            }
            if (err) console.log(err)
        }).then(function (db) { 
            //Do stuff after creation
            return console.log('After Creation')
          });

错误:

Cannot read property 'then' of undefined

我对链接和箭头功能感到非常痛苦...

2 个答案:

答案 0 :(得分:0)

countDocumentsnodejs 中有 4 个可能的签名:

countDocuments(callback: MongoCallback<number>): void;
countDocuments(query: FilterQuery<TSchema>, callback: MongoCallback<number>): void;
countDocuments(query?: FilterQuery<TSchema>, options?: MongoCountPreferences): Promise<number>;
countDocuments(query: FilterQuery<TSchema>, options: MongoCountPreferences, callback: MongoCallback<number>): void;

您正在尝试同时使用 2 个签名,您正在使用不返回任何内容的回调签名,然后您正在尝试对该空值使用 then 方法(一个承诺函数)。

如果您出于某种原因更喜欢使用回调而不是承诺,那么您需要使用 Promise 将其包装起来以保留逻辑,如下所示:

return new Promise((resolve, reject) => {
    db.collection(data.to).countDocuments({}, function (err, names) {
        if (names == 0) {
            db.collection(data.to).insertOne(defaultCollec);
            return console.log('Created:'+data.to)
        }
        if (err) console.log(err);
        resolve(console.log('After Creation'))
    })
})

答案 1 :(得分:0)

mongodb 有回调函数

mongoClient.connect(serverUrl, { useUnifiedTopology: true }, function (err, client) {}

突出显示的文本是 cb(){} 或尝试删除它并尝试以下内容,

mongoClient.connect(serverUrl, { useUnifiedTopology: true })
            .then()
            .catch()