【发布时间】: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