【问题标题】:Node & Express: Sending 404 response when using callbackNode & Express:使用回调时发送 404 响应
【发布时间】:2014-07-04 11:58:42
【问题描述】:

很抱歉标题很差,但我想不出更好的了。先看下面的代码sn -p:

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 响应。所以当服务需要被调用时,回调会在网络请求之后调用,否则回调只是内联调用。

代码执行良好,但我得到 200 响应。查看日志文件,似乎在发送 200 响应后调用了 response.send(404)。所以我假设 request.resume() 在 web 请求发生时被调用。这确实有道理。

但是无论我做什么,我都无法让它按我想要的方式运行。我试过了:

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

通常,无论我做什么,我都会破坏服务器,它要么超时,要么出错。

我浏览了网络,我不知所措。如果有人能够指出我正确的方向,那将不胜感激。我显然在这里错过了一个重要的知识,我是 node 和 express 的新手,这是我的第一个项目。

提前致谢。

干杯, 标记

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

【问题讨论】:

  • 试着在response.send(404);这一行之后说return。
  • 虽然我认为这行不通,但我还是试了一下,并没有什么不同。不过感谢您的快速回复。
  • 只是我以为即使出现错误,每次都会调用此response.send(html); 行。所以我想...
  • Mritunjay:是的,确实会,这是一个错误,只是不是我要寻找的错误 :)

标签: javascript node.js express


【解决方案1】:

这只是在发生异步调用时暂停请求流的简单问题。最后我的方法是这样的:

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

【讨论】:

  • 记得设置响应状态码=404
  • 为什么?根据 expressjs.org 上的文档,传递给 res.send() 的任何数字都将被解释为状态码。
  • 我不知道。
猜你喜欢
  • 2012-01-13
  • 1970-01-01
  • 2016-04-23
  • 2017-06-26
  • 2020-10-10
  • 2013-07-05
  • 1970-01-01
  • 2016-06-22
  • 1970-01-01
相关资源
最近更新 更多