【问题标题】:Error: Can't set headers after they are sent. Express.js错误:发送后无法设置标头。 Express.js
【发布时间】:2016-07-14 03:41:34
【问题描述】:

我在节点和堆栈上有点新,很长一段时间都出现这个错误。请帮我解决我的问题。 这是我的代码:

app.get('/', function(req , res){
request(url, function(err, response, html){
if (!err && response.statusCode == 200){
  var page = cheerio.load(html);
  page('.search-result-description').each(function(){
    var data = [];
    var name = page(this).find('.search-result-item__head');
    var company = page(this).find('.search-result-item__company');
    var description = page(this).find('.search-result-item__snippet');
    var requirements = page(this).find('.search-result-item__snippet');
    var salary = page(this).find('.b-vacancy-list-salary');

    data.push({
      vac_name:  name.eq(0).text(),
      vac_description: description.eq(0).text(),
      vac_requirements: requirements.eq(0).text(),
      var_company: company.eq(0).text(),
      vac_salary : salary.eq(0).text()
    });
    data = JSON.stringify(data, null, 4);
    res.render('main.ejs', {data: data});
  });
  }
});
});

【问题讨论】:

    标签: node.js express


    【解决方案1】:

    res.render() 这样发送http 响应的方法每个请求只能调用一次(每个请求只有一个响应)。当您多次调用它们时,您会收到有关已发送标头的错误消息。

    假设您的 page() 函数是同步的,您只需在循环结束后而不是在循环内移动几个语句,并将您的 data 变量声明也移动到循环外,这样您就可以积累数据用循环:

    app.get('/', function(req, res) {
        request(url, function(err, response, html) {
            if (!err && response.statusCode == 200) {
                var page = cheerio.load(html);
                var data = [];
                page('.search-result-description').each(function() {
                    var name = page(this).find('.search-result-item__head');
                    var company = page(this).find('.search-result-item__company');
                    var description = page(this).find('.search-result-item__snippet');
                    var requirements = page(this).find('.search-result-item__snippet');
                    var salary = page(this).find('.b-vacancy-list-salary');
    
                    data.push({
                        vac_name: name.eq(0).text(),
                        vac_description: description.eq(0).text(),
                        vac_requirements: requirements.eq(0).text(),
                        var_company: company.eq(0).text(),
                        vac_salary: salary.eq(0).text()
                    });
                });
                res.render('main.ejs', {
                   data: JSON.stringify(data, null, 4);
                });
            }
        });
    });
    

    如果request() 操作返回错误,您还应该进行一些错误处理。就目前而言,您永远不会响应请求。

    【讨论】:

      【解决方案2】:

      在 express 中,方法 render()、send()、json() 可以调用一次来响应客户端,第二次调用会发出 Error: Can't set headers after they are sent。从您的代码中, res.render() 被多次调用,因为您在循环中调用它。最好在调用 render() 之前检查响应是否完成,或者重新编写逻辑以仅调用一个 render()。

      【讨论】:

      • 这是一个合适的答案,因为这个问题更像是“记住”的事情!
      【解决方案3】:

      res.render之后添加行return false

      【讨论】:

        【解决方案4】:

        另外,在不同的 if-else 块中发送多个响应或使用回调时,请务必在设置响应后返回 null。

        let update = function (req, res, next) {

            let authResponse = res;
            console.log('userData==> ', req.body.userData)
            if (!req.params.ID) {
                console.log(':: res 1')
                res.status(404).json({
                    status: 'failed',
                    data: 'user id not defined'
                });
                return null;
            }
        

        }

        这会停止响应的设置,并且不会使执行更进一步。所以你不能设置多个 res 标头。没有直接关系,只是另一种可能会遇到此类问题的情况。

        【讨论】:

          猜你喜欢
          • 2015-08-10
          • 2016-05-01
          • 2015-09-08
          • 1970-01-01
          • 1970-01-01
          • 2020-04-30
          • 1970-01-01
          • 2014-02-13
          • 2018-06-08
          相关资源
          最近更新 更多