如何解决如果循环行为不符合预期,则循环多次[MongoDB,Nodejs]
代码:-1
app.get("/",function(req,res) {
// var whichDay = dayFormated.dayFormated();
//
// console.log(whichDay);
Item.find({},function(err,itemsFound) {
if (itemsFound.length === 0) {
console.log(itemsFound.length);
console.log("i Am Here if condition.");
Item.insertMany(defaultItems,function(err) {
console.log("I am inside insertMany");
if (err) {
console.log(err);
} else {
console.log("Successfully inserted default values to DB");
}
});
**res.redirect('/');**
console.log("exiting if bye :P");
} else {
console.log("back again at redirect");
// console.log(itemsFound);
res.render('list',{
titleToDoList: "Today",itemslist: itemsFound
});
}
});
});
控制台日志:-1
0
i Am Here if condition.
exiting if bye :P
0
i Am Here if condition.
exiting if bye :P
0
i Am Here if condition.
exiting if bye :P
0
i Am Here if condition.
exiting if bye :P
0
i Am Here if condition.
exiting if bye :P
0
i Am Here if condition.
exiting if bye :P
0
i Am Here if condition.
exiting if bye :P
0
i Am Here if condition.
exiting if bye :P
0
i Am Here if condition.
exiting if bye :P
0
i Am Here if condition.
exiting if bye :P
I am inside insertMany
Successfully inserted default values to DB
back again at redirect
I am inside insertMany
{ BulkWriteError: E11000 duplicate key error collection: todolistDB.items index: _id_ dup key: { _id: ObjectId('5f55f40136e7195ed7614bbb') }
at OrderedBulkOperation.handleWriteError (My_Project_Directorynode_modules/mongodb/lib/bulk/common.js:1257:9)
at resultHandler (My_Project_Directorynode_modules/mongodb/lib/bulk/common.js:521:23)
at handler (My_Project_Directorynode_modules/mongodb/lib/core/sdam/topology.js:942:24)
at fn (My_Project_Directorynode_modules/mongodb/lib/cmap/connection_pool.js:356:13)
at handleOperationResult (My_Project_Directorynode_modules/mongodb/lib/core/sdam/server.js:558:5)
at MessageStream.messageHandler (My_Project_Directorynode_modules/mongodb/lib/cmap/connection.js:277:5)
at MessageStream.emit (events.js:198:13)
at processIncomingData (My_Project_Directorynode_modules/mongodb/lib/cmap/message_stream.js:144:12)
at MessageStream._write (My_Project_Directorynode_modules/mongodb/lib/cmap/message_stream.js:42:5)
at doWrite (_stream_writable.js:415:12)
at writeOrBuffer (_stream_writable.js:399:5)
at MessageStream.Writable.write (_stream_writable.js:299:11)
at Socket.ondata (_stream_readable.js:710:20)
at Socket.emit (events.js:198:13)
at addChunk (_stream_readable.js:288:12)
at readableAddChunk (_stream_readable.js:269:11)
name: 'BulkWriteError',driver: true,code: 11000,writeErrors: [ WriteError { err: [Object] } ],result:
BulkWriteResult {
result:
{ ok: 1,writeErrors: [Array],writeConcernErrors: [],insertedIds: [Array],nInserted: 0,nUpserted: 0,nMatched: 0,nModified: 0,nRemoved: 0,upserted: [] } },insertedDocs:
[ { _id: 5f55f40136e7195ed7614bbc,itemName: 'Wakeup',__v: 0 },{ _id: 5f55f40136e7195ed7614bbd,itemName: 'Bath',__v: 0 } ] }
I am inside insertMany
{ BulkWriteError: E11000 duplicate key error collection: todolistDB.items index: _id_ dup key: { _id: ObjectId('5f55f40136e7195ed7614bbb') }
at OrderedBulkOperation.handleWriteError (My_Project_Directorynode_modules/mongodb/lib/bulk/common.js:1257:9)
at resultHandler (My_Project_Directorynode_modules/mongodb/lib/bulk/common.js:521:23)
at handler (My_Project_Directorynode_modules/mongodb/lib/core/sdam/topology.js:942:24)
at fn (My_Project_Directorynode_modules/mongodb/lib/cmap/connection_pool.js:356:13)
at handleOperationResult (My_Project_Directorynode_modules/mongodb/lib/core/sdam/server.js:558:5)
at MessageStream.messageHandler (My_Project_Directorynode_modules/mongodb/lib/cmap/connection.js:277:5)
at MessageStream.emit (events.js:198:13)
at processIncomingData (My_Project_Directorynode_modules/mongodb/lib/cmap/message_stream.js:144:12)
at MessageStream._write (My_Project_Directorynode_modules/mongodb/lib/cmap/message_stream.js:42:5)
at doWrite (_stream_writable.js:415:12)
at writeOrBuffer (_stream_writable.js:399:5)
at MessageStream.Writable.write (_stream_writable.js:299:11)
at Socket.ondata (_stream_readable.js:710:20)
at Socket.emit (events.js:198:13)
at addChunk (_stream_readable.js:288:12)
at readableAddChunk (_stream_readable.js:269:11)
name: 'BulkWriteError',__v: 0 } ] }
代码:-2
Item.find({},function(err) {
console.log("I am inside insertMany");
if (err) {
console.log(err);
} else {
console.log("Successfully inserted default values to DB");
**res.redirect('/');**
}
});
console.log("exiting if bye :P");
} else {
console.log("back again at redirect");
// console.log(itemsFound);
res.render('list',itemslist: itemsFound
});
}
});
});
控制台日志:-2
[nodemon] 2.0.4
[nodemon] to restart at any time,enter `rs`
[nodemon] watching path(s): *.*
[nodemon] watching extensions: js,mjs,json
[nodemon] starting `node app.js`
server running on port 3000
0
i Am Here if condition.
exiting if bye :P
I am inside insertMany
Successfully inserted default values to DB
back again at redirect
代码2可以正常工作,但是代码1可以循环多次。有人可以向我解释为什么一个代码多次循环吗?我加粗了代码的地方以供参考。谢谢!。
请参阅我粘贴的日志,其中介绍了该情况。
解决方法
由于无法发表评论而添加为答案。
代码1循环多次,因为res.redirect('/')
在Item.insertMany
的回调函数之外。
这是nodejs异步行为的经典示例。当代码到达mongo查询时,它将触发回调,并进入回调队列,等待数据库的响应。
因此,nodejs移至回调之外的下一个代码块,即res.redirect('/')
。这使代码再次调用'/'
端点。并且在完成insert db操作(这将使长度大于0)之前,您的代码始终将长度查找为0,并不断在循环中命中/
端点。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。