对于糟糕的头衔感到抱歉,但我想不出更好的事情。首先看下面的代码片段:
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()。这确实有意义。
然而无论我做什么,我都无法按照我想要的方式运作。我试过了:
一般来说,无论我做什么,我都会破坏服务器,它会超时或出错。
我在网上搜索过,我不知所措。如果有人能够指出我正确的方向,将非常感激。我显然在这里缺少一个重要的知识,我是节点和表达的新手,这是我的第一个项目。
提前致谢。
干杯, 标记
更新: 再看一遍并阅读https://github.com/joyent/node/blob/master/doc/api/stream.markdown。在使用异步回调时,我似乎需要在结束事件中显式调用pause,否则当我们返回时,流将关闭。我今天晚些时候会尝试并报告。
答案 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();
});