关于javascript:Node.js MongoDB插入错误

Node.js MongoDB insert error

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
function uploadVote(voter, vote){
MongoClient.connect(url, function(err, db){
    if (err) throw err;

    db.collection('testvote', function(err, collection) {
        collection.find({"psid": voter}).toArray(function(err, result) {
            if(!result[0]){
                db.collection("testvote").insert({psid:"a", choice:0}, function(err, res) {
                    if (err) throw err;

                    console.log('insertone')
                    sendTextMessage(".")
                });
            } else if(!result[0].choice){
                db.collection("testvote").update({psid: voter}, {$set: {'choice': vote}}, function(err, res){
                    if (err) throw err;
                    sendTextMessage(".")
                })
            } else{
                sendTextMessage(voter,"!");
            }

        });
        db.close();
    });
})
}

您好,我正在开发一个Facebook Messenger,可让用户投票。在上面的代码中,我完全看不到语法错误。但是执行此函数时,会不断出错:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/app/node_modules/mongodb/lib/utils.js:123
2017-05-18T12:09:19.856188+00:00 app[web.1]:     process.nextTick(function() { throw err; });
2017-05-18T12:09:19.856188+00:00 app[web.1]:                                   ^
2017-05-18T12:09:19.858765+00:00 app[web.1]:     at ReplSet.insert (/app/node_modules/mongodb/lib/replset.js:398:18)
2017-05-18T12:09:19.858761+00:00 app[web.1]: MongoError: topology was destroyed
2017-05-18T12:09:19.858764+00:00 app[web.1]:     at ReplSet.insert (/app/node_modules/mongodb-core/lib/topologies/replset.js:1025:47)
2017-05-18T12:09:19.858766+00:00 app[web.1]:     at executeCommands (/app/node_modules/mongodb/lib/bulk/ordered.js:455:23)
2017-05-18T12:09:19.858766+00:00 app[web.1]:     at OrderedBulkOperation.execute (/app/node_modules/mongodb/lib/bulk/ordered.js:508:10)
2017-05-18T12:09:19.858767+00:00 app[web.1]:     at bulkWrite (/app/node_modules/mongodb/lib/collection.js:664:8)
2017-05-18T12:09:19.858768+00:00 app[web.1]:     at Collection.insertMany (/app/node_modules/mongodb/lib/collection.js:534:44)
2017-05-18T12:09:19.858769+00:00 app[web.1]:     at /app/index.js:121:41
2017-05-18T12:09:19.858768+00:00 app[web.1]:     at Collection.insert (/app/node_modules/mongodb/lib/collection.js:836:15)
2017-05-18T12:09:19.858770+00:00 app[web.1]:     at handleCallback (/app/node_modules/mongodb/lib/utils.js:120:56)
2017-05-18T12:09:19.858771+00:00 app[web.1]:     at /app/node_modules/mongodb/lib/cursor.js:860:16

请帮助我解决此问题。


数据库调用将是异步的,这意味着db.close()行将在回调内部的代码之前运行。

您需要确保仅在完成连接后才调用db.close()。您可以将其放在每个代码分支的末尾(即在sendTextMessage()的每种情况之后),也可以将整个内容package在promise中,然后在这些位置调用resolve。

这是package在Promise中的代码版本。 resolve()方法仅在您知道不再有其他请求时才调用。您也不能将其package在Promise中,并在我已放置resolve()语句的每个位置放置一个db.close()语句。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
function uploadVote(voter, vote){
  MongoClient.connect(url, function(err, db){
      if (err) throw err;

      new Promise((resolve, reject) => {
          db.collection('testvote', function(err, collection) {
              collection.find({"psid": voter}).toArray(function(err, result) {
                  if(!result[0]){
                      db.collection("testvote").insert({psid:"a", choice:0}, function(err, res) {
                          if (err) throw err;

                          console.log('insertone')
                          sendTextMessage(".")
                          resolve();
                      });
                  } else if(!result[0].choice){
                      db.collection("testvote").update({psid: voter}, {$set: {'choice': vote}}, function(err, res){
                          if (err) throw err;
                          sendTextMessage(".")
                          resolve();
                      })
                  } else{
                      sendTextMessage(voter,"!");
                      resolve();
                  }

              });
          });
      }).then(() => db.close());
  })
}


如果得到这样的MongoError: topology was destroyed,则表明您与MongoDB服务器的连接已中断。确保连接良好,并且在运行查询时该连接正在运行。