【问题标题】:NodeJs app "hanging" or "freezing" whenever an error occurs每当发生错误时,NodeJs 应用程序“挂起”或“冻结”
【发布时间】:2018-05-26 07:15:34
【问题描述】:

当我向我的 nodejs 服务器发出多个 post 请求并且所有参数都正确时,一切正常(并且不会冻结)但是当我使用不正确的参数发出多个 post 请求时,我的 nodejs 服务器只是冻结/挂起几分钟。这是为什么呢?

顺便说一句,这是我的代码

app.post('/pushtransaction', function(req, res) {
    console.log(req.body);
    console.log(5);
    if (req.body.sigs) {
        let sigver = xmf.modules.ecc.Signature.from(req.body.sigs).toString();
        let lasig = [sigver];
        console.log(req.body.packedTr);
        let transi = JSON.parse(req.body.packedTr);

        //let sigver = req.body.sigs;
        let package = {
            compression: 'none',
            transaction: transi,
            signatures: lasig
        }

        console.log(package);
        //Pushes tx in correct format
        xmf.pushTransaction(package).then(result=>{
            res.send(result);
            res.end();
            console.log(result);
        }).catch(err => {
            console.log(err)
        });
    }
})

【问题讨论】:

  • 您进行了多少次“多次发帖请求”。 Javascript 自然地处理错误比无错误代码慢,所以这可能是问题的一部分。

标签: javascript node.js server


【解决方案1】:

当您遇到错误时,您的 Node 服务器不知道除了 console.log() 错误之外该做什么。它需要结束该请求并发送一些响应。你可以res.status(400).send({ error: err })当你在捕获范围内。

【讨论】:

    【解决方案2】:

    确保每次在您的请求中都调用res.send() 方法。

    更新的 Javascript:

    app.post('/pushtransaction', function(req, res) {
        console.log(req.body);
        console.log(5);
        if (req.body.sigs) {
            let sigver = xmf.modules.ecc.Signature.from(req.body.sigs).toString();
            let lasig = [sigver];
            console.log(req.body.packedTr);
            let transi = JSON.parse(req.body.packedTr);
    
            //let sigver = req.body.sigs;
            let package = {
                compression: 'none',
                transaction: transi,
                signatures: lasig
            }
    
            console.log(package);
            //Pushes tx in correct format
            xmf.pushTransaction(package).then(result=>{
                res.send(result);
                res.end();
                console.log(result);
            }).catch(err => {
                console.log(err);
                res.status(400).send();
            });
        }
    
        res.status(400).send();
    })
    

    此外,如果您拨打res.send(),则不必拨打res.end()。见Must res.end() be called in express with node.js?

    【讨论】:

      【解决方案3】:

      添加到其他答案,您可以添加一个中间件用于超时,如果任何服务在一段时间内无法响应,例如

      var timeout = require('connect-timeout');
      app.use(timeout('5s'));
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-01-10
        • 1970-01-01
        • 1970-01-01
        • 2015-08-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-21
        相关资源
        最近更新 更多