node.js - find() 和游标问题 : . toArray 与cursor.forEach 方法显示不同的结果和错误 "Can' 发送后设置 header 。”

标签 node.js mongodb express cursor

嗨,新手,我在 Express 中使用本地主机上的视频数据库尝试了 .toArray 方法。这段代码工作正常,我能够使用 Handlebars 作为我的模板引擎显示数据,每个数据在有边框的容器中显示标题、年份和 imdb:

MongoClient.connect('mongodb://127.0.0.1:27017', function(err, database){
    assert.equal(null,err);
    console.log('Successfully connected to MongoDB');

    var db = database.db('video');

    router.get('/', function(req,res){
        db.collection('movieDetails').find({}).toArray(function(err,result){
          res.render('home', {
              title: 'Movies',
              movieDetails: result
          });
          database.close();
        });
    });
});

但是,使用光标方法,我看不到任何数据,只看到边框和标签,并且我在 bash shell 上收到此错误“发送后无法设置 header ”。这是代码:

MongoClient.connect('mongodb://127.0.0.1:27017', function(err, database){
        assert.equal(null,err);
        console.log('Successfully connected to MongoDB');

        var db = database.db('video');

        router.get('/', function(req,res){
           var query = {};
           var cursor = db.collection('movieDetails').find(query);
           cursor.forEach(
               function(result){
                  res.render('home',{
                      title: 'Movies',
                      movieDetails: result
                  });
               },
               function(err){
                  assert.equal(err, null);
                  return database.close();
               }
           );
        });
    });

这是我的主页使用 Handlebars 模板引擎的代码:

{{#each movieDetails}}
    <div class="movie_data">
        <h5>{{this.title}}</h5>
        <p><strong>Year:</strong> {{this.year}} <strong>Imdb:</strong> {{this.imdb}}</p>
    </div>
{{/each}}

需要帮助,我似乎不知道如何使用光标方法显示数据,谢谢!

最佳答案

您共享的两个代码片段之间存在语义差异。罪魁祸首在结果处理程序中。

在第一个处理程序(作为 toArray 函数的回调)中,告诉库以数组的形式为您提供结果。当您要求 Express 服务器发送响应时,您将传递存储的整个数组(引用存储在 result 变量中)。

在第二个处理程序中,您使用游标方法,forEach 调用告诉 Mongo 库对游标结果内的每个元素执行回调。这意味着如果您的查询返回 5 部电影,则回调将执行 5 次。这也意味着 res.render 将尝试执行 5 次。这将导致您看到的错误,因为在第二次迭代中,您引用的 res 实例已经被发送。

由于 Handlebars 内的处理程序需要一个电影数组,而您给出的响应是单个电影实例(请记住 forEach 方法会将集合中的每个项目单独传递给 result 参数内的回调),因此您的页面将无法正确呈现。

希望这对您有所帮助。祝你好运:)

关于node.js - find() 和游标问题 : . toArray 与cursor.forEach 方法显示不同的结果和错误 "Can' 发送后设置 header 。”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48417530/

相关文章:

javascript - NodeJS 带 MongoDb : Removing a sub-field in a document

javascript - Node.js回调函数返回数据

node.js - NodeJs 中的中间件总是重定向到同一页面(我猜)

javascript - 在 Node 中将 javascript 范围与expressjs 一起使用的正确方法

javascript - Expressjs Mongoose 查找嵌套嵌入文档未定义

node.js - 无法从 Internet 访问 AWS 中使用端口 3000 的 NodeJs 应用程序

node.js - 如何使用 NodeJS 与 mongo Db 中的用户和给定记录关联

java - 如何配置MongoDB字段级加密?

python - 如何更新 mongoDb 中的特定值

javascript - Express:如果 JSON 中不存在对象,如何返回 404?