Как я могу вернуть ответ, только если один вызов метода завершен в node js

#javascript #node.js #express #http #promise

#javascript #node.js #выразить #http #обещание

Вопрос:

У меня есть узел js с экспресс-приложением. Мне нужно предоставить конечную точку rest, которая вернет ответ на http-вызов. Что бы я ни пробовал, он возвращается до http-запроса. Не могли бы вы помочь

 app.all('/query', function(req, res){
  // here i need to make a http call 
    let urlCall =   new Promise((resolve, reject) => {
        http.get('http://test.com', (response) => {
            let sdata = '';

            response.on('data', (fragments) => {
              sdata  = fragments;
            });
        
            response.on('end', () => {
              let response_body = sdata;
              resolve(response_body.toString());
            });
        
            response.on('error', (error) => {
            // promise rejected on error
                reject(error);
            });
        });
    });
    urlCall.then((response) => {
        var responseData=response;
        res.json(responseData);
        res.end();
    }).catch((error) => {
        console.log(error);
        res.end();
    });
}
  

Комментарии:

1. почему вы используете new Promise ?

Ответ №1:

Ваш код должен работать, но я подозреваю, что ошибка запроса не обрабатывается (обработчик события ошибки отсутствует в вашем запросе).

Вы можете попробовать переместить обработчик ошибок из ответа в запрос

 app.all("/query", function (req, res) {
  // here i need to make a http call

  let urlCall = new Promise((resolve, reject) => {
    http
      .get("http://test.com", (response) => {
        let sdata = "";

        response.on("data", (fragments) => {
          sdata  = fragments;
        });

        response.on("end", () => {
          let response_body = sdata;
          resolve(response_body.toString());
        });
      })
      .on("error", (error) => { // handling request errors
        console.error("error");
        // promise rejected on error
        reject(error);
      });
  });

  urlCall.then(
    (response) => {
      res.json(response);
      res.end();
    },
    (error) => {
      console.log(error);
      res.end();
    }
  );
});