find() 和游标问题:.toArray vs cursor.forEach 方法显示不同的结果和错误"Can't set headers after they are sent."



嗨,这里的新手,我使用本地主机上的视频数据库尝试了 .toArray 方法。这段代码工作正常,我能够使用车把作为我的模板引擎来显示数据,每个数据在有边框的容器中显示标题、年份和 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 上收到此错误"发送后无法设置标头。 这是代码:

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

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

{{#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函数的回调)中,告诉库以数组的形式为您提供结果。当您请求快速服务器发送响应时,您正在传递存储的整个数组(引用存储在result变量中)。

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

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

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

这应该可以按您的预期工作

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

我在尝试使用forEach()时遇到了同样的问题,并做了很多寻找答案,但大多数回答是"只使用toArray()"。但是我想使用forEach()提高效率的"流式处理批处理文档",对吗?错。。。

我看到你使用来自mongoUni的相同数据,我也是,我在那里提出了一个问题,这是最佳答案的细分......

例如,效率仅适用于 250,000 的大量结果,但通常在渲染模板时,我们可能只需要 50。

使用forEach()返回 50 个结果实际上比toArray()效率低,因为它强制光标执行迭代和数组构建。

toArray()基本上实现了一个"异步循环",它为您"迭代"光标内容,并且仅在异步迭代完成后返回。对于小批量结果(在查询中使用limit()),toArray()是最好的,也是唯一的选择。

相关内容

  • 没有找到相关文章

最新更新