簡體   English   中英

使用 express 出錯:發送標頭后無法設置標頭

[英]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
            });
        });
    });

});

來源:使用 Express 和 MongoDB 從多個單獨的集合中獲取

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM