当前位置: 首页 > 面试题库 >

使用Express / Node.js和Angular处理已取消的请求

上官高翰
2023-03-14
问题内容

当客户端/浏览器取消了挂起的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: 在看到“错误>某些错误”控制台打印输出后,什么都没有发生。我认为它应该在带有错误参数的下一条路径上继续,但似乎没有这样做。这是怎么回事? 问题答案: 策略实施与验证请求和处理成功/失败一起使用。 假设您正在使用此路由(向其传递了电子邮件地址和密码): 这将调用该