[英]Getting Error with express : Can't set headers after they are sent
我正在创建 express 应用程序,并在路由器中从 mongodb 获取数据。 这是我的代码
router.get('/', function(req, res, next) {
MongoClient.connect(url, function(err, db) {
db.collection('school').find({}).toArray(function(err, doc) {
assert.equal(null, err);
assert.ok(doc != null);
res.render('index', { title: 'iGyan.org', schools: doc});
});
db.collection('students').find({}).toArray(function(err, doc) {
assert.equal(null, err);
assert.ok(doc != null);
res.render('index', { title: 'iGyan.org',students: doc});
});
db.close();
});
});
当我运行代码并在浏览器中打开一个 url 时,它在控制台上给我错误说明
Error: Can't set headers after they are sent.
我已经看到几乎所有关于堆栈溢出的建议问题,但无法从中获得帮助。
我知道错误是因为我在函数中渲染 res 两次,但不知道如何克服这种情况。
由于 db 调用是异步的,因此在呈现响应之前,您需要确保它们都已完成。 根据该答案,您可以使用异步库来完成此操作。
您只能像这样呈现一次响应:
router.get('/', function(req, res, next) {
MongoClient.connect(url, function(err, db) {
var data = {};
var tasks = [
// Load users
function(callback) {
db.collection('school').find({}).toArray(function(err, doc) {
if (err) return callback(err);
data.schools = doc;
callback();
});
},
// Load colors
function(callback) {
db.collection('students').find({}).toArray(function(err, doc) {
if (err) return callback(err);
data.students: doc;
callback();
});
}
];
//This function gets called after the two tasks have called their "task callbacks"
async.parallel(tasks, function(err) {
//If an error occurred, let express handle it by calling the `next` function
if (err) return next(err);
db.close();
res.render('index', {
title: 'iGyan.org',
students: data.students,
schools: data.schools
});
});
});
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.