Перенаправить ответ API REST на интерфейс пользователя / браузера NodeJs / Express / Request - PullRequest
0 голосов
/ 22 октября 2019

Невозможно отправить ответ вызова API REST на страницу браузера с помощью сервера NodeJs с модулями Express и Request.

Я понимаю, что из-за асинхронного характера метода обратного вызова ответ вызова APIне могут быть возвращены в типичном стиле.

Я пробовал метод res.send, но он выдает ошибку res.send не является функцией.

Ниже приведен пример того, что я пробовал.

        const options = {
            url: endPoint,
            method: 'POST',
            headers: {
                'Authorization': 'Basic',
                'Accept': 'application/json',
                'Content-Type': 'application/json',
                'Accept-Charset': 'UTF-8'
            }
        };
        request(options, (err, res, body) => {
            if (err) { return console.log(err); }
            //want to send this body to the page.
            console.log(JSON.stringify(body));
            res.send(body);
        });

Выдает это сообщение об ошибке

res.send(body);
TypeError: res.send is not a function
at Request.request [as _callback]

1 Ответ

0 голосов
/ 24 октября 2019

понял проблему. Первая проблема была, как @vipul указал выше. res был ответом на вызов, а не экземпляром глобального объекта HttpResponse, поэтому метод отправки не был доступен для этого объекта. Я изменил метод,

    request(options, (err, response, body) => {
        if (err) { return console.log(err); }
        //want to send this body to the page.
        console.log(JSON.stringify(response.body));
        // using the HttpResponse in global context.
        this.res.send(JSON.parse(body));
    });

Затем я столкнулся с ошибкой ниже,

Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client]

Проблема была во время выполнения обратного вызова, я возвращал ответ сразу после обратного вызова метода.

  .get('/authorize', (req, res) => {
      console.log('Authorize Hit! '+req.query.code);
      try {
          //TODO: Need to utilize state to the current flow in action.
          let flowDetails = flow.flowMap.get('wsf');
          if(flowDetails) {
            //this method makes REST API call
            flowDetails.refreshToken(req, res);
            //this line was the problem!! Removed it to fix the error.
            res.send('Refresh Token Completed!');
          }
      } catch (error) {
          (Object.keys(error).length === 0)?res.send(error.message):res.send(error);
      }
  })

Но из-за асинхронного характера функции обратного вызова к моменту получения ответа на обратный вызов фактический запрос / ответ уже был возвращен, и запрос был выполнен. Поэтому удалите res.send сразу после вызова, чтобы исправить проблему.

Надеюсь, это будет полезно и другим:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...