当客户端/浏览器取消了挂起的HTTP请求时,带有Express的Node似乎继续处理该请求。对于密集请求,CPU仍然忙于处理不必要的请求。
有没有办法让Node.js / Express杀死/停止这些被要求取消的未决请求?
它给出的是,由于AngularJS 1.5
HTTP请求是容易变得特别有用的撤销通过调用$cancelRequest()
上$http
/
$resource
对象。
当暴露提供自动完成或搜索字段结果的API方法时,可能会发生此类取消:在要自动完成或提前输入的字段中键入内容时,可以取消以前的请求。
全局server.timeout
不能解决问题:1)它是所有公开的API方法的先验全局设置2)被取消的请求中正在进行的处理不会被杀死。
注入的req
对象随侦听器一起提供.on()
。
侦听close
事件允许处理客户端关闭连接的时间(Angular取消了请求,或者例如用户关闭了查询选项卡)。
这是两个简单的示例,说明如何使用close
事件停止请求处理。
示例1:可取消同步块
var clientCancelledRequest = 'clientCancelledRequest';
function cancellableAPIMethodA(req, res, next) {
var cancelRequest = false;
req.on('close', function (err){
cancelRequest = true;
});
var superLargeArray = [/* ... */];
try {
// Long processing loop
superLargeArray.forEach(function (item) {
if (cancelRequest) {
throw {type: clientCancelledRequest};
}
/* Work on item */
});
// Job done before client cancelled the request, send result to client
res.send(/* results */);
} catch (e) {
// Re-throw (or call next(e)) on non-cancellation exception
if (e.type !== clientCancelledRequest) {
throw e;
}
}
// Job done before client cancelled the request, send result to client
res.send(/* results */);
}
示例2:带有promise的可取消异步块(模拟为reduce)
function cancellableAPIMethodA(req, res, next) {
var cancelRequest = false;
req.on('close', function (err){
cancelRequest = true;
});
var superLargeArray = [/* ... */];
var promise = Q.when();
superLargeArray.forEach(function (item) {
promise = promise.then(function() {
if (cancelRequest) {
throw {type: clientCancelledRequest};
}
/* Work on item */
});
});
promise.then(function() {
// Job done before client cancelled the request, send result to client
res.send(/* results */);
})
.catch(function(err) {
// Re-throw (or call next(err)) on non-cancellation exception
if (err.type !== clientCancelledRequest) {
throw err;
}
})
.done();
}
问题内容: 我是一个Node.js新手,并且正在用它创建我的第一个大型应用程序(我正在使用Express)。当用户使用get请求加载ID时,我需要让我的网页执行一些javascript画布绘制 我知道我可以用一个简单的方法来处理 但我不知道如何使用该ID的要求的图纸开始我的网页。互联网上Express和Get上的每个教程都说明了如何处理get请求…这个问题是关于“接下来会发生什么?” 改写:我不确
问题内容: 我想使用Node.js域来捕获异常。到目前为止,它正在运行,但是有一个地方我无法获得域来捕获异常。回调中的exception2是在domain.on(’error’)处理程序中捕获并处理的,但没有捕获exception1。奇怪的是,当抛出exception1时,它不会像我期望的那样关闭Node。这是我的示例应用程序: 为了使exception2执行,我注释掉了exception 1。
问题内容: 当我使用Express时,我的代码是: 我将如何获得 原始请求正文 ? 问题答案: 编辑2: 主体解析器模块的1.15.2版引入了原始模式,该模式将主体作为Buffer返回。默认情况下,它还会自动处理deflate和gzip解压缩。用法示例: 默认情况下,该对象具有以下默认选项: 如果您希望原始解析器解析以外的其他MIME类型,则需要在此处进行更改。它还将支持通配符匹配,例如或。 注意
问题内容: 我有一个非常普通的Express应用程序- 简单的服务器逻辑,视图,许多客户端JS。我必须执行许多AJAX请求。其中一些需要通过HTTPS协议保护(某些不需要)。 因此,我的服务器应同时使用HTTP和HTTPS。它也应该在本地计算机(正常运行nodemon)和Heroku上都可以工作。 据我了解,Heroku为您提供了一个您可以监听的端口(process.env.PORT),并通过代理
问题内容: 我研究了如何通过此堆栈交换在节点中进行错误处理,但是我不确定身份验证失败时护照在做什么。我有以下LocalStrategy: 在看到“错误>某些错误”控制台打印输出后,什么都没有发生。我认为它应该在带有错误参数的下一条路径上继续,但似乎没有这样做。这是怎么回事? 问题答案: 策略实施与验证请求和处理成功/失败一起使用。 假设您正在使用此路由(向其传递了电子邮件地址和密码): 这将调用该