Получить возвращаемое значение функции, импортированной из другого модуля в Node - PullRequest
0 голосов
/ 22 октября 2018

У меня есть основной файл app.js и файл helper.js следующим образом:

helper.js:

  exports.lookup = function(id){

  var xml = '<?xml version="1.0" encoding="ISO-8859-1"?> \
              <data>\
               <key>aSecretKey</key>\
               <request>read</request>\
               <id>'+id+'</id> \
              </data>';

  var options = {
    url:'https://somesite.com',
    headers: {'Content-Type': 'application/xml'},
    body:xml
  };

  request.post(options, function (e, r, body){
    var data = JSON.parse(parser.toJson(body)).result;

    return data;

  });
};

app.js:

app.post('/customer', (req, res) => {

  flg.lookup(req.body.id);  <---- How do I access what this imported function returns?

eg, console.log(result of flg.lookup)

  res.render('index', {customerEmail:'test5@test5.com'}); 

});

Я хотел бы передать функцию из вспомогательного файла и вернуть ее результат в app.js.

В настоящее время она возвращает только неопределенное значение, что странно.

Ответы [ 2 ]

0 голосов
/ 22 октября 2018

Проблема / решение

helper.js выполняет асинхронный HTTP-запрос.Следовательно, return data выполняется после того, как возвращен поиск функции.

Вы хотите использовать функцию обратного вызова вместо return.

Возможно, вы захотите прочитатьнемного документации о том, как работать с асинхронным программированием в node.js, вот справочная статья .

Исправленный код

Обновленный код будет выглядеть следующим образом:

helper.js

  exports.lookup = function(id, callback){

  var xml = '<?xml version="1.0" encoding="ISO-8859-1"?> \
              <data>\
               <key>aSecretKey</key>\
               <request>read</request>\
               <id>'+id+'</id> \
              </data>';

  var options = {
    url:'https://somesite.com',
    headers: {'Content-Type': 'application/xml'},
    body:xml
  };

  request.post(options, function (e, r, body){
    var data = JSON.parse(parser.toJson(body)).result;

    callback(null, data);

  });
};

app.js

app.post('/customer', (req, res) => {

  flg.lookup(req.body.id, function(err, res) {
      // this callback function is called by lookup function with the result
      if (err)
          throw err

      console.log('result is', res);

      res.render('index', {customerEmail:'test5@test5.com'}); 

  });

});

Альтернативные решения

Вы также можете решить проблему ysing Promises или async / await,Я позволю вам посмотреть их в вашей любимой поисковой системе.

0 голосов
/ 22 октября 2018

Поскольку запрос не поддерживает обещания, вы можете заключить свой вызов API в Обещание и использовать его с async await

helper.js

exports.lookup = function(id){

  var xml = '<?xml version="1.0" encoding="ISO-8859-1"?> \
              <data>\
              <key>aSecretKey</key>\
              <request>read</request>\
              <id>'+id+'</id> \
              </data>';

  var options = {
    url:'https://somesite.com',
    headers: {'Content-Type': 'application/xml'},
    body:xml
  };

  return new Promise((resolve, reject) => {
    request.post(options, function (e, r, body){
      if (e) {
        reject(e);
      }

      var data = JSON.parse(parser.toJson(body)).result;
      resolve(data);
    });
  });
};

app.js

app.post('/customer', async (req, res) => {
  try {
    const result = await flg.lookup(req.body.id);
    console.log(result);
    res.render('index', {customerEmail:'test5@test5.com'});
  catch (e) {
    // do something with the error
  }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...