node.js +表示API状态代码200,但客户端仍处于待处理状态

时间:2013-06-21 14:17:52

标签: node.js jquery express

我有一个非常简单直接的用Node.js和Express编写的API工作得很好,但jQuery.post调用仍然会“待定”(并最终超时)。在服务器端,我监视了请求和结果,并在约40ms内记录了200响应代码和相应的数据。无论我刷新页面多少次(调用中的数据是静态的,而不是基于输入),请求在服务器上成功完成,但挂起在客户端。如果我重新启动node.js服务器脚本,一切都很好,并恢复客户端上的正常功能。

在过去3天没有重启的情况下顺利运行,然后在我重新启动脚本后大约一小时我不得不再做一次。过去2小时一直很好。

  • Node.js v0.10.10
  • Express 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函数的代码:     函数发送(req,res,data,status){     var isJsonp = req.query.hasOwnProperty('callback');     if(!status)status = 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

1 个答案:

答案 0 :(得分:1)

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

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

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

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

我认为这是你唯一的错误,但是这是一个好主意A)尝试保持你的逻辑足够小和足够简单,以便通过HTTP响应和return语句直观地确认每个分支终止在适当的情况下,然后B)当事情必然变得更大或更多时,考虑使用return,只要您发送响应作为防御性编码技术。