获取从Node中另一个模块导入的函数的返回值

时间:2018-10-22 14:37:43

标签: node.js express

我有一个主要的app.js文件和一个helper.js文件:

helper.js:

%matplotlib inline 
import pandas as pd
import matplotlib as plt

d1 = {
    'index' : [1, 2, 3, 4, 5], 
    'col1'  : [5, 8, 6, 4, 2]
}

d2 = {
    'index' : [3, 5], 
    'col1'  : [6, 2]
}

df1 = pd.DataFrame(d1).set_index(["index"])
df2 = pd.DataFrame(d2).set_index(["index"])

df1.plot(kind="barh", grid=False)

app.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中。

当前,它仅返回undefined,这很奇怪。

2 个答案:

答案 0 :(得分:0)

由于请求不支持,您可以将api调用包装在Promise中,并与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
  }
});

答案 1 :(得分:0)

问题/解决方案

helper.js执行异步http请求。因此,return data是在函数查找返回后执行的。

您要使用回调函数而不是return

您可能想阅读一些有关如何处理node.js中的异步编程的文档,这里是reference article

更正的代码

更新后的代码如下:

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'}); 

  });

});

替代解决方案

您也可以使用Promisesasync / await解决问题,我让您在自己喜欢的搜索引擎中查找它们。