对不起,这个头衔不好,但我想不出更好的办法。首先看下面的代码片段:
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/