【问题标题】:Can't set headers after they are sent Node / Express发送后无法设置标头 Node / Express
【发布时间】:2017-08-11 00:12:03
【问题描述】:

我正在尝试使用 jquery 将数据从客户端的表单发布到发布路由,该路由将数据发送到节点/快递中的 api。

我收到错误消息 Can't set headers after they are sent,我不知道为什么。

我该如何解决这个问题?

客户:

<input id="prospect-form" type="text" placeholder="Email Address" class="form-control" style="vertical-align: baseline; display:inline-block; background-color: white; border: none;" onClick="submitData()" />

<script charset="utf-8">
    var submitData = function() {
      var data = $("prospect-form").serialize();
      $.post("/prospect/" + data, function() {
        console.log("data sent");
      })
      .done(function() {
        console.log("data success");
      })
      .fail(function() {
        console.log("data failed");
      })
      .always(function() {
        console.log("data finished");
      })
    }
</script>

快递:

router.post('/prospect/:query', function(req, res) {
  var data = req.params.query;
  var options = {
    url: "https://prospect.io/api/public/v1/prospects",
    formData: data,
    headers: {
      "Authorization": "",
      "Content-Type": "application/vnd.api+json; charset=utf-8",
    }
  }

  function callback(error, response, body) {
  if (!error && response.statusCode == 200) {
    var info = JSON.parse(body);
    console.log(info);
    }
  }

  request.post(options, callback) //post

  res.end()

}) //router post

非常感谢!

【问题讨论】:

    标签: javascript jquery node.js express post


    【解决方案1】:

    您应该将 res.end() 移到回调函数中。

    更新的可能是

    router.post('/prospect/:query', function(req, res) {
      var data = req.params.query;
      var options = {
        url: "https://prospect.io/api/public/v1/prospects",
        formData: data,
        headers: {
          "Authorization": "",
          "Content-Type": "application/vnd.api+json; charset=utf-8",
        }
      }
    
      function callback(error, response, body) {
       if (!error && response.statusCode == 200) {
        var info = JSON.parse(body);
        console.log(info);
       }
       res.end()
      }
    
      request.post(options, callback) //post
    
    }) //router post
    

    【讨论】:

      【解决方案2】:

      问题很简单。

      我认为 request.post(options, callback) 是一个异步函数,对吧? 当代码开始执行 res.end() 时,函数 request.post 仍然作为一个单独的线程执行。

      这就是您遇到此多线程问题的原因。这是 node 和 express 的常见异步错误。

      解决方案是使用promise、async.js 或async/await 使其成为同步顺序。

      【讨论】:

      • 实际上request.post() 并没有在另一个线程中执行。它是异步的,但 node.js 中的网络操作使用操作系统异步网络调用,并且不使用额外的线程。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多