如何在请求之外获取数据

时间:2019-06-17 10:27:43

标签: node.js request

我有一种情况,我需要在请求之外接受请求方法的响应(正文)。我该怎么办?

request.post({
      url: 'http://localhost/api/messages',
      form: { key: message }
  }, function (err, httpResponse, body) {
          tmsg = body;
      })
  console.log(tmsg);

我需要此tmsg进行下一步处理,实际情况如下。

app.post('/incomemsg', function (req, res) {

  var mediaCount = req.body.NumMedia;

  if (mediaCount == 0) {
    //var twiml = getResponse(message);
      var twiml = new MessagingResponse();
      request.post({
          url: 'http://localhost:3978/api/messages',
          form: { key: message }
      }, function (err, httpResponse, body) {
              tmsg = body;
          })
      console.log(tmsg);
  }else {
   //dosomething which outputs tmsg
}
  res.writeHead(200, { 'Content-Type': 'text/xml' });
  res.end(tmsg.toString());
});

2 个答案:

答案 0 :(得分:0)

问题是您正在尝试为request.post's callback()中的全局变量赋值,该变量仅在request.post由异步逻辑执行后才被调用(API调用都是异步的),因此更好的方法是 promisify request.post并等待request.post使其看起来是同步的。

const requestPromisified = requestObject =>
  new Promise((resolve, reject) => {
    request.post(requestObject, function(err, httpResponse, body) {
      if (err) {
        reject(err);
      }
      resolve(body);
    });
  });

const body = await requestPromisified({
  method: "POST",
  url: "http://localhost/api/messages",
  form: { key: message }
});

答案 1 :(得分:0)

发出请求时,您只能使用tmsg进行操作,因此您需要像这样重新排列代码:

app.post('/incomemsg', function (req, res) {

    var mediaCount = req.body.NumMedia;
    var twiml = new MessagingResponse();

    request.post({
        url: 'http://localhost:3978/api/messages',
        form: { key: message }
    }, function (err, httpResponse, body) {
        tmsg = body;
        console.log(tmsg);

        if (mediaCount === 0) {
            //do something with tmsg
        } else {
            //do something else with tmsg


        }

        res.writeHead(200, { 'Content-Type': 'text/xml' });
        res.end(tmsg.toString());
    });
});

否则tmsg将为null,因为没有要求填充该变量。