通过express获取错误:发送后无法设置标题

我正在创build快速应用程序,并在路由器中,我要从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. 

我已经看到几乎所有build议的问题在堆栈溢出问题,但不能得到帮助。

我知道这个错误是因为我在函数中渲染了两次,但不知道如何克服这种情况。

由于数据库调用是asynchronous的,你需要确保它们在呈现响应之前完成。 基于这个答案 ,你可以使用asynchronous库来完成这个任务。

你只能像这样呈现响应一次:

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

来源: 使用Express和MongoDB从多个独立的集合中获取数据