节点& Express:使用回调时发送404响应

时间:2014-07-04 11:58:43

标签: javascript node.js express

对于糟糕的头衔感到抱歉,但我想不出更好的事情。首先看下面的代码片段:

app.use(function(request, response){
    request.addListener('end', function() {
        parseUrl(request.url, function(urlInfo) {
            if (urlInfo.notFound)
                response.send(404);
            else if (urlInfo.extension == '.html') {
                response.render(
                    urlInfo.path, 
                    { 
                        file: urlInfo.filenameWithoutExtension, 
                        url: urlInfo.url, 
                        directory: urlInfo.directory
                    },
                    function(error, html) {
                        if (error) {
                            console.log("Error rendering view: " + error);
                            response.send(404);
                        }

                        response.send(html);
                    });
            }
            else
                file.serve(request, response);
        });
    }).resume();
});

此代码执行正常并提供页面服务。对于某些请求,parseUrl将调用Web服务。此服务的结果决定了我们是否应该向客户端发送404响应。因此,当需要调用服务时,在Web请求之后调用回调,否则只是内联调用回调。

代码执行正常,但我收到200响应。查看日志文件,看起来在发送200响应后调用response.send(404)。所以我假设在Web请求发生时正在调用request.resume()。这确实有意义。

然而无论我做什么,我都无法按照我想要的方式运作。我试过了:

  • 将request.resume移至回调的结尾
  • 删除app.use并在回调结束时执行request.resume。

一般来说,无论我做什么,我都会破坏服务器,它会超时或出错。

我在网上搜索过,我不知所措。如果有人能够指出我正确的方向,将非常感激。我显然在这里缺少一个重要的知识,我是节点和表达的新手,这是我的第一个项目。

提前致谢。

干杯, 标记

更新: 再看一遍并阅读https://github.com/joyent/node/blob/master/doc/api/stream.markdown。在使用异步回调时,我似乎需要在结束事件中显式调用pause,否则当我们返回时,流将关闭。我今天晚些时候会尝试并报告。

1 个答案:

答案 0 :(得分:0)

在异步调用发生时暂停请求流只是一个问题。最后,我的方法最终结束了:

app.use(function(request, response){
    request.on('end', function() {
        var parseStatus = parseUrl(request.url, function(urlInfo, status) {
            if (urlInfo.notFound)
                response.send(404);
            else if (urlInfo.extension == '.html') {
                response.render(
                    urlInfo.path,
                    {
                        file: urlInfo.filenameWithoutExtension,
                        url: urlInfo.url,
                        directory: urlInfo.directory
                    },
                    function(error, html) {
                        if (error) {
                            console.log("Error rendering view: " + error);
                            response.send(404);
                        }
                        else
                            response.send(html);
                    });
            } else
                file.serve(request, response);

            if (status.executedAsynchronously)
                request.resume();
        });

        if (parseStatus.executedAsynchronously)
            request.pause();

    }).resume();
});