首页 > 解决方案 > 对于循环行为不符合预期,循环多次[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',
  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 循环多次。有人可以向我解释为什么代码一循环多次吗?我将代码的位置加粗以检查参考。谢谢!。

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

标签: javascriptnode.jsmongodbmongooseejs

解决方案


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

代码 1 循环多次,因为res.redirect('/')Item.insertMany.

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

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


推荐阅读