2

我有一个用 Node.js 和 Express 编写的非常简单明了的 API,它工作得很好,但时不时地,jQuery.post调用将保持“待处理”(并最终超时)。在服务器端,我已经监控了请求和结果,它200在大约 40 毫秒内记录了带有适当数据的响应代码。无论我刷新页面多少次(调用中的数据是静态的,不是基于输入的),请求在服务器上成功完成,但在客户端挂起。如果我重新启动 node.js 服务器脚本,一切都很好并且客户端上的正常功能恢复。

在过去的 3 天里它运行顺利,没有重新启动,然后在我重新启动脚本大约一小时后,我不得不再次执行它。过去 2 小时现在一切正常。

  • Node.js v0.10.10
  • 快递 v3.2.6

任何见解都会有所帮助。谢谢。

编辑- 添加代码 这是挂起的功能。

exports.getDistinct = function(req, res) {
var params = {
    filter:     function() {
                    var filter = getParams(req, 'filter');
                    if ( filter ) {
                        f = {};
                        for (var key in filter)
                            f[key] = { $in: filter[key] }

                        var search = getParams(req, 'search');
                        if ( search ) {
                            for (var key in search) {
                                f[key] = new RegExp(helper.escapeRegExp(search[key]),"gi");
                            }
                        }
                        return f;
                    } else {
                        // send error
                        send(req,res,{'error': 'no filter specified'}, 500);
                    }
                }(),
    field:      function() {
                    var field = getParams(req, 'field');
                    if ( field ) return field;
                    else send(req,res,{'error': 'no field specified'}, 500);
                }(),
};

//console.log(util.inspect(params,false, null));
db.results.distinct(
    params.field,
    params.filter,
    function(err, results) {
        if (err) send(req,res,err,500);
        if (params.field == 'Title') {
            var filtered = [];
            db.testcases.find().sort( { _id: 1 } ,function(err, tcnames) {
                if (err) send(req,res,err,500);

                for (var i=0;i<results.length;++i) {
                    if (results[i].match(/^up/gi)) {
                        tcnames.filter( function(tc) { 
                            if (tc._id == results[i]) filtered.push(tc);
                        });
                    } 
                }
                filtered.sort(helper.compare);
                send(req,res,filtered,200);
            });
        } else {
            send(req,res,results,200);
        }
    }
);
}

这是send正在使用的函数的代码: function send(req, res, data, status) { var isJsonp = req.query.hasOwnProperty('callback'); 如果(!状态)状态= 200;if (isJsonp) res.send(req.query['callback']+'('+JSON.stringify(data)+')', status); 否则 res.send(数据,状态);}

编辑刚刚注意到这一点httpd.conf,我不知道它是否相关:

BrowserMatch "Mozilla/2" nokeepalive
BrowserMatch "MSIE 4\.0b2;" nokeepalive downgrade-1.0 force-response-1.0
BrowserMatch "RealPlayer 4\.0" force-response-1.0
BrowserMatch "Java/1\.0" force-response-1.0
BrowserMatch "JDK/1\.0" force-response-1.0

BrowserMatch "Microsoft Data Access Internet Publishing Provider" redirect-carefully
BrowserMatch "MS FrontPage" redirect-carefully
BrowserMatch "^WebDrive" redirect-carefully
BrowserMatch "^WebDAVFS/1.[0123]" redirect-carefully
BrowserMatch "^gnome-vfs/1.0" redirect-carefully
BrowserMatch "^XML Spy" redirect-carefully
BrowserMatch "^Dreamweaver-WebDAV-SCM1" redirect-carefully
4

1 回答 1

1

因此,通常这些症状意味着您的请求处理程序中的逻辑有一个分支,该分支未通过响应请求或省略保护子句return语句而正确终止。我认为这是您的代码中的错误,可能还有其他情况:

if (err) send(req,res,err,500);

那是一个错误。它将发送响应但继续执行函数的其余部分,从而导致行为不端。你要:

if (err){ 
  return send(req,res,err,500);
}

我认为这是你唯一的错误,但这是一个好主意 A)尽量保持你的逻辑足够小和足够简单,以便轻松地在视觉上确认每个分支都以 HTTP 响应和return适当的语句终止,然后 B)当事情发生时一定会变得更大或更多,请考虑return在发送响应时使用作为防御性编码技术。

于 2013-06-21T18:50:03.470 回答