【问题标题】:node js request.post callback not firing节点js request.post回调未触发
【发布时间】:2016-12-28 23:30:33
【问题描述】:

我正在尝试将一些 JSON 数据从节点 js 应用程序发送到另一个用 Flask 编写的 Web 服务。我正在尝试使用请求库并查看了问题herehere

根据示例,我想出了以下简单的应用程序。该应用程序将 JSON 数据发送到我的烧瓶服务器,但不会获取/触发回调。我检查了 Flask 应用程序是否通过postman 返回了一些数据,并且工作正常。 我哪里错了?

[这是我的整个 app.js]

  var express = require("express");
  var request = require('request');
  var app = express();

  app.set('view engine', 'pug');
  app.get('/', function(req, res) {
    console.log("here...")
      request({
          url: 'http://localhost:5000/receive_user_response',
          method: "POST",
          headers: {
              "content-type": "application/json"
          },
          json: {  // <--- I have also tried calling this as "body" 
              user_id: "some id...",
              user_info: "some info..."
          },
        function(err, res, data) {
            console.log('err', err) // <---- never prints any thing from here!
            console.log('res', res)
            console.log('data', data)
              if (!err && res.statusCode == 200) {
                  console.log(data);
              }
          }
    })
    console.log("here...done..")
  });

  var server = app.listen(3000, function() {
      console.log("Listening on port %s...", server.address().port);
  });

【问题讨论】:

  • 我不确定这是否只是将您的代码放入 SO 的问题,但您似乎在回调函数之前缺少 }
  • 你确定……我觉得还可以……
  • 是的,我很确定。您在request({ 有一个开口{,后跟属性urlmethodheadersjson。在为json 关闭} 之后,您将立即拥有您的回调函数,而无需关闭opts 对象。 callback 是一个单独的参数
  • 你是对的!我认为该请求只需要一个对象列表......但实际上它需要 2 个对象,一个是选项,第二个是回调。
  • 别担心!无论如何,我自己更喜欢request-promise 模块!

标签: node.js express http-post httprequest


【解决方案1】:

回调函数必须是request函数的第二个参数。您不小心将它放在 json 对象中。以下将起作用。

request({
    url: 'http://localhost:5000/receive_user_response',
    method: "POST",
    headers: {
      "content-type": "application/json"
    },
    json: {  // <--- I have also tried calling this as "body" 
      user_id: "some id...",
      user_info: "some info..."
    }
  },
  function(err, res, data) {
    console.log('err', err) // <---- never prints any thing from here!
    console.log('res', res)
    console.log('data', data)
    if (!err && res.statusCode == 200) {
      console.log(data);
    }
  }
)

但这绝对是更好的阅读。

let options = {
  url: 'http://localhost:5000/receive_user_response',
  method: "POST",
  headers: {
    "content-type": "application/json"
  },
  json: {  // <--- I have also tried calling this as "body" 
    user_id: "some id...",
    user_info: "some info..."
  }
};


request(options,
  function(err, res, data) {
    console.log('err', err) // <---- never prints any thing from here!
    console.log('res', res)
    console.log('data', data)
      if (!err && res.statusCode == 200) {
        console.log(data);
      }
  }
)

【讨论】:

    【解决方案2】:

    这不是真正的答案,但我可以通过使用 request-promise 而不是请求来让它工作。

    var express = require("express");
    var app = express();
    var rp = require('request-promise');
    
    var options = {
        method: 'POST',
        uri: 'http://localhost:5000/receive_user_response',
        body: {
            some: 'payload'
        },
        json: true // Automatically stringifies the body to JSON
    };
    
    app.set('view engine', 'pug');
    app.get('/', function(req, res) {
    
        rp(options).then(function(res) {
            console.log(res);
    
        }).catch(function(err) {
            console.log("error!");
        });
    
    });
    
    var server = app.listen(3000, function() {
        console.log("Listening on port %s...", server.address().port);
    });
    

    【讨论】:

      猜你喜欢
      • 2017-05-25
      • 2015-12-22
      • 2017-12-07
      • 2012-01-27
      • 2018-06-10
      • 1970-01-01
      • 2016-01-17
      • 2018-07-15
      • 1970-01-01
      相关资源
      最近更新 更多