带有 Express 异步 API 调用的 Node.JS
Posted
技术标签:
【中文标题】带有 Express 异步 API 调用的 Node.JS【英文标题】:Node.JS with Express async API call 【发布时间】:2017-03-10 15:06:47 【问题描述】:我正在使用带有 Express 的 Node.JS(以及用于视图的 ejs),我想调用两个 API 端点以在同一页面中呈现它们并使用数据。我试过用异步来做,但我得到了
ECONNRESET: Request could not be proxied!
这是我的代码
app.get('/profile', function(req, res)
async.parallel([
function(next)
var query = req.query.search;
var url = '1st url' + query;
var request = require('request');
request(url, function(error, body)
var data = JSON.parse(body);
next(error, data);
);
,
function(next)
request('2nd url', function(error, tlist)
var list = JSON.parse(tlist);
next(error, list);
);
], function(err, results)
if (!err && results.statusCode == 200)
var data = results[0];
var list = results[1];
res.render('profile', data: data, list: list);
);
);
【问题讨论】:
你坐在代理后面吗?ECONNRESET
表示连接已从另一端关闭。你应该检查你的HTTP_PROXY
/HTTPS_PROXY
环境变量。
嗨,不。事实上,我正在使用 Cloud9 的在线 IDE。当我解析数据然后尝试破坏回调结果数组并将其分配给我的变量时,就会出现问题。我想在网页中独立使用这两个 JSON 文件。
首先找出两个请求中的哪一个导致错误(我的钱在第一个)。尝试从您的本地机器上运行它。否则把网址贴出来,我们可以查一下。
如何包含request
模块还有另一个问题。将require('request')
行移至文件顶部。
【参考方案1】:
不确定 Cloud9,但如果问题在于解析数据,这里有几件事。
您应该在尝试解析之前处理每个请求的错误;如果 parse 抛出异常,你的回调将不会被执行:
request(url, function(error, body)
if (error) return next(error);
var data = JSON.parse(body);
next(null, data);
);
您可能还应该在解析过程中使用 try/catch,并在出现异常时执行回调并报错:
request(url, function(error, body)
if (error) return next(error);
var data;
try
data = JSON.parse(body);
catch (e)
return next(new Error('Unable to parse body for ' + url));
next(null, data);
);
最后,您当前对 results.statusCode
的检查将始终返回 false,因为它是一个数组,因此您不会到达请求的末尾。我猜这可能是问题所在。我还建议将来自 async
的任何错误传递给 Express 错误处理程序:
function(err, results)
if (err)
// pass to Express error handler...
var data = results[0];
var list = results[1];
res.render('profile', data: data, list: list);
);
【讨论】:
正如 svens 所指出的,您需要将require('request')
放在顶部
嘿,谢谢你的指点。我完成了上述所有操作并尝试再次运行服务器,我收到以下错误Error: Unable to parse body for <url> at Request._callback
API 端点自己工作正常,只是当我尝试同时调用它们时才会发生这种情况。我需要在我的网络应用程序中使用这两个 JSON 文件,但要独立使用,因此我认为将它们都放在一个对象中会适得其反。
这意味着正文不可解析。如果我没记错的话,我认为request
将其主体作为第三个参数传递,因此您的回调可能应该类似于request(url, (err, httpResponse, body) => )
。可能值得尝试在解析正文之前注销它以查看它的样子。以上是关于带有 Express 异步 API 调用的 Node.JS的主要内容,如果未能解决你的问题,请参考以下文章
使用nodejs和rest api调用和express进行异步处理-序列错误
Express RESTful API 中的 Discord.js