如何使用异步模块的请求
how to use request with async module
我的一个控制器正在对100秒的页面进行爬网,其中它从页面中提取所有链接,当链接保存到数据库后,我使用afterCreate生命周期回调(下面是代码)
afterCreate: function(createdLink, next) {
var request = require("request");
var currentLink = config.apiUrl + "update/linkstatus?linkPath=" + createdLink.linkUrl;
request(currentLink, function(error, response, body) {
console.log("saved", body);
});
next();
}
这触发另一个控制器,该控制器获取这些链路中的每一个的状态;以下是该控制器的代码:
linkstatus: function(req, res) {
var request = require("request");
var currentLink = req.query.linkPath;
request(currentLink, function(error, response, body) {
if(error) {
console.log(error);
}
var thisStatusCode = response.statusCode;
Link.update(
{linkUrl: currentLink}, {statusCode: thisStatusCode}
).exec(function(err, updatedLink) {
res.status(200).send(updatedLink);
});
});
}
问题是,在一些电话之后,我开始得到以下错误:
TypeError: Cannot read property 'statusCode' of undefined
at Request._callback (/home/ubuntu/myapp/api/controllers/UpdateController.js:11
2:32)
at self.callback (/home/ubuntu/myapp/node_modules/request/request.js:360:22)
at Request.emit (events.js:107:17)
at Request.onRequestError (/home/ubuntu/myapp/node_modules/request/request.js:1
假设我编写的"linkstatus"控制器操作没有正确完成,无法同时从1000个链接中获取状态代码响应,根据我的理解,我需要使用异步模块和Promises来解决这个问题,但我很难理解回调和Promise的概念,所以在这个上获得输入将是非常棒的
您的问题是不能保证响应,在节点内部请求失败的情况下,您必须在继续之前进行检查。
linkstatus: function(req, res, next) {
var request = require("request");
var currentLink = req.query.linkPath;
request(currentLink, function(error, response, body) {
if(error || !response) {
console.log(error);
}
else {
var thisStatusCode = response.statusCode;
Link.update(
{linkUrl: currentLink}, {statusCode: thisStatusCode}
).exec(function(err, updatedLink) {
res.status(200).send(updatedLink);
});
}
});
}
相关文章:
- NodeJS请求模块-http上的body.IncomingMessage
- 使用节点请求模块的 UTF8 字符编码
- Node.js:无法使用请求模块进行PROFIND
- 错误:在 get 中结束 - 节点后请求(模块)管道后请求后写入
- 无法通过请求模块抓取数据 - Fobidden
- 使用 NodeJS 的请求模块进行 HTTP 身份验证,返回未定义的正文
- 如何发出许多 Node.js 请求(使用请求模块)
- 节点.JS请求模块回调未触发
- GiantBomb API 请求获取 HTML 而不是 JSON,Nodejs 请求模块
- 无法使用节点请求模块进行基本的 HTTP 身份验证
- 无法使用请求模块处理 url
- 从请求模块接收的正文是否包含计算的 css
- 带有有效负载的Firefox插件sdk请求模块POST方法
- 使用请求模块nodejs下载文件时需要filename
- 无法使用Python和请求模块从.aspx登录页获得所需的响应
- 错误:使用mode.js的请求模块读取ECONNRESET
- 带有node.js请求模块的多个请求池
- 代理选项不工作在请求模块的nodejs
- 节点请求模块Http.IncomingMessage没有发出事件
- 我该如何回应呢?在请求模块中写入