Как получить переменную из http запроса NodeJS? - PullRequest
0 голосов
/ 07 апреля 2020

Я хотел бы использовать две службы IBM Watson, объединить ответы обоих в одну переменную и вернуть ее в качестве обратного вызова. Я не мог понять, как получить значение response1 вне запроса http, чтобы объединить его с response2 из другой службы IBM Watson.

Я попробовал приведенный ниже код, но он не работал. Я читал, что могу использовать обещания, но я довольно новичок в этом и не могу понять, как это сделать.

Может кто-нибудь помочь, пожалуйста?

  const AWS = require('aws-sdk');
        var http = require('https');
        exports.handler = (event, context, callback) => {
                var text = JSON.stringify(event.text);
                var options = {
                       method: process.env.method,
                       hostname: process.env.watson_hostname,
                       port: null,
                       path: process.env.path,
                       headers: {
                           'content-type': process.env.content_type,
                            authorization: process.env.authorization,
                           'cache-control': process.env.cache_control,
                           'X-Watson-Learning-Opt-Out': 'true'
                       }
                 };
                   var req = http.request(options, function (res) {
                   var chunks = "";
                   res.on("data", function (chunk) {
                   chunks+ = chunk.toString();;
                      });
                res.on("end", function () { 
                       var response1 = (chunks);
                 //////////////here I need to get reponse2
                 var response2 = IBM2();
              var bothResponses = response1 + response2
              callback(null,bothResponses)
                 
                 
               });
               })
            
  req.write(text);
  req.end()
  
  
  function IBM2(){
              var text = JSON.stringify(event.text);
                var options = {
                       method: process.env.method2,
                       hostname: process.env.watson_hostname2,
                       port: null,
                       path: process.env.path2,
                       headers: {
                           'content-type': process.env.content_type2,
                            authorization: process.env.authorization2,
                           'cache-control': process.env.cache_control,
                           'X-Watson-Learning-Opt-Out': 'true'
                       }
                 };
                   var req = http.request(options, function (res) {
                   var chunks = [];
                   res.on("data", function (chunk) {
                   chunks.push(chunk);
                      });
                res.on("end", function () { 
                       var response2 = JSON.parse(Buffer.concat(chunks));
                  
                   
                   return(response2)
    }

Ответы [ 2 ]

1 голос
/ 07 апреля 2020

Не знаю, есть ли у вас другие ошибки, но похоже, что вы не ожидаете ответа2 до конца sh, возможно, что-то вроде

const response2 = await IBM2():

или если вы хотите использовать обещания, может быть что-то вроде:

res.on('end', function () {
  var response2 = IBM2().then(
    val => {
      var bothResponses = response1 + val;
      callback(null, bothResponses);
    },
    reject => {
      /* handle rejection here */
    },
  );
});
1 голос
/ 07 апреля 2020

Возвращает обещание из вашей функции IBM2 и обрабатывает, используя asyn c, ожидает в вызывающей функции. Обратите внимание на ключевое слово async перед on end callback.

Я пытался добавить Promise в ваш существующий поток:

const AWS = require('aws-sdk');
var http = require('https');
exports.handler = (event, context, callback) => {
  var text = JSON.stringify(event.text);
  var options = {
    method: process.env.method,
    hostname: process.env.watson_hostname,
    port: null,
    path: process.env.path,
    headers: {
      'content-type': process.env.content_type,
      authorization: process.env.authorization,
      'cache-control': process.env.cache_control,
      'X-Watson-Learning-Opt-Out': 'true'
    }
  };
  var req = http.request(options, function (res) {
    var chunks = "";
    res.on("data", function (chunk) {
      chunks += chunk.toString();;
    });
    res.on("end", async function () {
      var response1 = (chunks);
      //////////////here I need to get reponse2
      var response2 = await IBM2();
      // validate response2 (in case IBM2 throws error)
      var bothResponses = response1 + response2;
      callback(null,bothResponses)
    });
  });

  req.write(text);
  req.end();


  function IBM2(){
    return new Promise((resolve, reject) =>{
      var text = JSON.stringify(event.text);
      var options = {
        method: process.env.method2,
        hostname: process.env.watson_hostname2,
        port: null,
        path: process.env.path2,
        headers: {
          'content-type': process.env.content_type2,
          authorization: process.env.authorization2,
          'cache-control': process.env.cache_control,
          'X-Watson-Learning-Opt-Out': 'true'
        }
      };
      var req = http.request(options, function (res) {
        var chunks = [];
        res.on("data", function (chunk) {
          chunks.push(chunk);
        });
        res.on("end", function () {
          var response2 = JSON.parse(Buffer.concat(chunks));
          resolve(response2)
        });
        res.on("error", function (err) {
          reject(err);
        });
      })
    });
  }
};

Прежде чем вносить какие-либо изменения в ваш код Я бы предложил вам go через эти темы в первую очередь. Для справки взгляните на концепцию обещаний и asyn c -wait

Promiese

Async / Await

...