【问题标题】:'TypeError: meme.find(...).forEach is not a function' in mongoose node js?猫鼬节点js中的'TypeError:meme.find(...).forEach不是函数'?
【发布时间】:2018-12-03 05:22:31
【问题描述】:

我想在 MongoDB 中循环浏览我的集合,所以我尝试.forEach 执行该操作,但看起来这不是正确的方法。每次我尝试运行它都会给我错误:TypeError: meme.find(...).forEach is not a function

这是我的代码:

var meme = require('../app/model/meme');

meme.find().forEach(function(meme){
   meme.update({_id: meme._id}, {$set: { objectID: meme._id.toString().slice(10).slice(0,24)}}); 
});

我正在使用 mongoose 和 node.js 来执行操作。

对于解决此问题的任何帮助,我将不胜感激。

谢谢。

【问题讨论】:

    标签: javascript node.js mongodb mongoose


    【解决方案1】:

    find 方法是异步函数,因此它不会返回结果,而是需要传递回调

    Here你有那个方法的文档

    所以你应该打电话,例如。像这样:

    meme.find().exec(function (err, docs) {
        // something
    });
    

    【讨论】:

    • 你能演示一下我应该如何将它应用到我上面的代码中吗?
    【解决方案2】:
    var meme = require('../app/model/meme');
    
    meme.find().then(memes => {
        memes.forEach(function(meme){
            meme.update({_id: meme._id}, {$set: { objectID: meme._id.toString().slice(10).slice(0,24)}}); 
        });
    })
    

    尝试以上一个, mongoose 返回一个 Promise,你必须先执行结果,然后才能迭代该结果。

    【讨论】:

      【解决方案3】:

      function() 中存在三个主要状态如果您在stream 中找到数据,则需要更新数据,然后如果出现问题需要处理...并且需要处理最终该函数已完成工作需要给call back找不到数据...

       var meme = require('../app/model/meme');
      
      meme.find(query).stream()
        .on('data', function(meme){
         meme.update({_id: meme._id}, {$set: { objectID: meme._id.toString().slice(10).slice(0,24)}}); 
        })
        .on('error', function(err){
         //Getting `error` Something went wrong
        })
        .on('end', function(){
          // finally end
        });
      

      【讨论】:

        【解决方案4】:

        您正在使用异步方法find,因此您应该使用承诺或回调来获取结果,这里有一些解决方案选择您想要的

        // 使用承诺

        meme.find().then((memes) => {
          memes.forEach((meme) => {
            console.log(meme);
          });
        });
        

        // 使用回调

        meme.find({}, (err, memes) => {
          memes.forEach((meme) => {
            console.log(meme);
          });
        });
        

        // 使用执行

        meme.find().exec((err, memes) => {
          memes.forEach((meme) => {
            console.log(meme);
          });
        });
        

        【讨论】:

        • 当我运行代码时,它没有向我的控制台返回任何内容?
        【解决方案5】:

        您应该尝试以下方法:

        const f = async () => {
          for await (let m of meme.find()) {
            // do something with m
          }
        }
        

        mongoose "find" 函数返回查询,它是可迭代的。因此,无需一次获取所有文档。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-10-14
          • 2015-11-19
          • 2018-12-29
          • 1970-01-01
          • 2015-05-14
          • 2017-12-11
          相关资源
          最近更新 更多