嗨,新手,我在 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/