【问题标题】:Getting Error with express : Can't set headers after they are sent快递出错:发送后无法设置标题
【发布时间】:2017-01-18 15:54:28
【问题描述】:

我正在创建快速应用程序,并在路由器中从 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 但不知道如何克服这种情况。

【问题讨论】:

    标签: javascript node.js mongodb express http-headers


    【解决方案1】:

    由于 db 调用是异步的,因此您需要在呈现响应之前确保它们都已完成。基于that answer,您可以使用async 库来完成此操作。

    你可以像这样只渲染一次响应:

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

    来源:Fetch from multiple, separate, collections with Express and MongoDB

    【讨论】:

    • 做了同样的事情,但是当我控制台数据时它给了我{}。
    • @iGyan.Org 抱歉,我将渲染移到了正确的位置。
    • 仍在我正在获取的数据中{}。
    • @iGyan.Org 那时,我修复了Can't set headers after they are sent. 错误,但我不知道为什么您的代码不起作用,因为我无法测试它。您可以尝试在渲染之前记录数据并尝试查看 mongo 请求是否有效。
    • 为避免出现竞争情况,我改进了您的编辑以确保两个调用都将在渲染之前完成。
    猜你喜欢
    • 1970-01-01
    • 2015-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-31
    • 2019-07-17
    • 1970-01-01
    相关资源
    最近更新 更多