Node.js MongoDB 插入错误
Node.js MongoDB insert error
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 信使。在上面的代码中,我完全没有看到任何语法错误。但是这个函数执行的时候一直报错:
/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
请帮我解决这个问题。
如果您收到这样的 MongoError: topology was destroyed
,则表示您与 MongoDB 服务器的连接已中断。请确保您的网络连接良好,并且 运行 正在 运行 查询。
数据库调用将是异步的,这意味着 db.close()
行将在回调中的代码之前 运行。
您需要确保 db.close()
仅在您完成连接后才被调用。您可以将它放在每个代码分支的末尾(即在 sendTextMessage()
的每个案例之后),或者将整个事情包装在一个承诺中,然后在这些位置调用 resolve。
这是一个包含在承诺中的代码版本。 resolve()
方法仅在您知道没有更多请求时才会调用。您也可以不将其包装在承诺中,并在我放置 resolve()
语句的每个地方放置一个 db.close()
语句。
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());
})
}
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 信使。在上面的代码中,我完全没有看到任何语法错误。但是这个函数执行的时候一直报错:
/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
请帮我解决这个问题。
如果您收到这样的 MongoError: topology was destroyed
,则表示您与 MongoDB 服务器的连接已中断。请确保您的网络连接良好,并且 运行 正在 运行 查询。
数据库调用将是异步的,这意味着 db.close()
行将在回调中的代码之前 运行。
您需要确保 db.close()
仅在您完成连接后才被调用。您可以将它放在每个代码分支的末尾(即在 sendTextMessage()
的每个案例之后),或者将整个事情包装在一个承诺中,然后在这些位置调用 resolve。
这是一个包含在承诺中的代码版本。 resolve()
方法仅在您知道没有更多请求时才会调用。您也可以不将其包装在承诺中,并在我放置 resolve()
语句的每个地方放置一个 db.close()
语句。
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());
})
}