как получить данные вне запроса - PullRequest
0 голосов
/ 17 июня 2019

У меня есть сценарий, в котором мне нужно получить ответ (тело) метода запроса вне запроса.Как я могу это сделать?

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 голосов
/ 17 июня 2019

Вы можете сделать что-то только с 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 будет нулевым, потому что не было никакого запроса для заполнения этой переменной.

0 голосов
/ 17 июня 2019

Проблема в том, что вы пытаетесь присвоить значение глобальной переменной в request.post's callback (), который вызывается только после того, как request.post выполняется асинхронной логикой (все вызовы API являются асинхронными), поэтому лучшим способом было бы обещаем 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 }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...