【问题标题】:For loop behaviour not as expected, looping multiple times [ MongoDB, Nodejs ]对于循环行为不符合预期,循环多次[MongoDB,Nodejs]
【发布时间】:2020-12-25 16:59:21
【问题描述】:

代码:- 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',
  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',
  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',
  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',
  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',
  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',
  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',
  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',
  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 } ] }

代码:- 2

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
      });
    }

  });

});

控制台日志:- 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 循环了多次。有人可以向我解释为什么代码一循环多次吗?我将代码的位置加粗以检查参考。谢谢!。

查看我粘贴的日志,其中解释了该场景。

【问题讨论】:

  • 我在您发布的代码中没有看到一个 for 循环。
  • 对不起,我说的是 app.get("/") 中的 Model.insertMany() 它一直在循环。请参考我粘贴的日志作为参考。
  • 好吧,在/ 路由中,您重定向到/,这样它就会一遍又一遍地自行运行。您需要发送响应,而不仅仅是一遍又一遍地重定向回相同的路由。
  • 您是否查看过它正在重复的日志文件 { 0 i Am Here if condition.当我重定向回调函数时多次退出 if bye :P }。
  • 是的。每次它进入那里时,您都会不断调用res.redirect("/"),这只会使路线被一遍又一遍地调用。您认为其中哪一部分不是错误的并且是导致问题的原因?

标签: javascript node.js mongodb mongoose ejs


【解决方案1】:

由于无法发表评论,因此添加为答案。

代码 1 循环多次,因为 res.redirect('/')Item.insertMany 的回调函数之外。

这是 nodejs 异步行为的经典示例。当代码到达 mongo 查询时,它会触发回调并进入回调队列等待来自数据库的响应。

所以 nodejs 移动到回调之外的下一个代码块,即res.redirect('/')。这使得代码再次调用'/' 端点。并且在插入数据库操作完成之前(这将使长度大于 0),您的代码始终会找到长度为 0 并在循环中不断命中/ 端点。

【讨论】:

  • 谢谢 Siddharth,我是 nodejs 新手,对 node 中的代码流如何工作有点困惑,我真的很感谢你的努力。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-12-12
  • 2020-07-28
  • 2010-10-23
  • 1970-01-01
  • 2019-05-05
  • 2013-04-05
  • 1970-01-01
相关资源
最近更新 更多