Как я могу отправить response.body из функции модуля запроса? - PullRequest
0 голосов
/ 26 января 2020

Я начал с создания оператора return в функции запроса (я связал картинку), а затем console.log за пределами function, но это не сработало.

Код моего сервера

var options = {
  'method': 'POST',
  'url': 'http://localhost:8080/ES_Part1/api/user/getUser',
  'headers': {
      'Content-Type': 'application/x-www-form-urlencoded'
  },
  form: {
      'username': username,
      'password': password
  }
};

requestToApi(options, function(error, response) {
  if (error) throw new Error(error);
  console.log("Send form data to remote api and to return the user from Spring")
  console.log(response.body);
  return response.body
});

var fromapi = response.body;

res.end();

Пример: 1

Ответы [ 2 ]

0 голосов
/ 26 января 2020

?‍? Если вы хотите получить respose.body вне обработчика, чем вы можете использовать этот код ниже ?:

// an example get function
app.get('/users', async(req, res) => {
  var options = {
    'method': 'POST',
    'url': 'http://localhost:8080/ES_Part1/api/user/getUser',
    'headers': {
        'Content-Type': 'application/x-www-form-urlencoded'
    },
    form: {
        'username': username,
        'password': password
    }
  };

  const result = new Promise((resolve, reject) => {
    requestToApi(options, function(error, response) {
      if (error) return reject(error);
      return resolve(JSON.parse(response.body));
    });
  })

  // make sure, to use async in your function
  // because we're using await here
  var fromapi = await result;
  // It's working here
  console.log(fromapi);

  res.end();
})

Этот код выше ?, только пример, который вы можете использовать для чтения response.body. Если вы хотите исправить ошибку из этого кода выше, вы можете использовать этот код ниже:

try {
    // make sure, to use async in your function
    // because we're using await here
    var fromapi = await result;
    // It's working here
    console.log(fromapi);
  } catch(ex) {
    // print error response
    console.log(ex.message);
}

Я надеюсь, что это может помочь вам ?.

0 голосов
/ 26 января 2020

Я предлагаю вам использовать подход, основанный на Promise, а не стиль обратного вызова, который вы используете для requestToApi. Если вы используете пакет request, доступна версия на основе Promise.

Альтернативным решением было бы создать promise самостоятельно, например:

var requestToApiAsPromise = (options) => {
  return new Promise((resolve, reject) => {
    requestToApi(options, (error, response) => {
      if (error) {
        reject(error)
        return
      }
      resolve(response.body)
    })
  })
}

Затем вы можете использовать этот метод в своем промежуточном программном обеспечении:

app.post("/checkUser", (req, res) => {
  async function process() {
    try {
      var username = req.body.username
      var password = req.body.password
      var options = {...}

      var response = await requestToApiAsPromise(options)
      // response => response.body

      // do whatever

      res.end()
    } catch (error) {
      next(error)
    }
  }
  process()
})

Этот метод использует async/await, так что он позволяет вам писать свой код, как если бы вы делали вещи синхронно, что облегчает его создание асинхронные вызовы, заставляющие их «ждать», прежде чем будет выполнена следующая строка.

...