对不起,这个头衔不好,但我想不出更好的办法。首先看下面的代码片段:

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。似乎我需要在使用异步回调时在结束事件中显式调用暂停,否则流将在我们返回时关闭。我将在今天晚些时候尝试此方法并报告。

最佳答案

这只是在异步调用发生时暂停请求流的问题。最后,我的方法最终如下所示:

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();
});

关于javascript - Node&Express:使用回调时发送404响应,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24573804/

10-16 19:33