在发送Node / Express后无法设置标头

时间:2017-03-19 19:43:15

标签: javascript jquery node.js express post

我正在尝试使用jquery将客户端表单中的数据发布到将数据发送到node / express中的api的post路由。

我收到错误发送后无法设置标头,我无法弄清楚原因。

我该如何解决这个问题?

客户:

<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

非常感谢!

2 个答案:

答案 0 :(得分:0)

问题很简单。

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

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

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

答案 1 :(得分:0)

您应该在回调函数中移动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