我有一个主要的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,这很奇怪。
答案 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'});
});
});
您也可以使用Promises
或async / await
解决问题,我让您在自己喜欢的搜索引擎中查找它们。