[英]Why does the webpage load forever if there is a 404?
我有一个由 Heroku 托管的 Express.js/Node.js 网站。 如果找不到文件,服务器应该发送 404 错误(就像大多数网站一样)。 但是我代码中的错误处理程序不能正常工作。 当客户端请求一个不存在的文件时,页面将加载...并加载...并加载...永远。 当服务器检测到找不到文件时,如何让服务器停止加载?
这是我的 JavaScript 的第一部分:
var express = require('express'); // Express.js
var app = express();
var http = require('http');
var server = http.createServer(app);
var bodyParser = require('body-parser');
var postgres = require('pg'); // Postgres database
app.use(express.static('static', {
extensions: ['html']
}));
app.all('*', function (request, response, next) {
var redirectURL = request.query.redirect;
if (redirectURL != undefined) {
response.redirect(redirectURL);
}
});
app.get('/', function (request, response, next) {
response.redirect('/main/index');
});
以下是我的错误处理中间件(紧接在上一部分之后)。 第一个处理 400x 错误代码,第二个处理 500x 错误代码。
// Handle 404 error
app.use(function(request, response) {
response.status(400);
response.send("Error 404!");
});
// Handle 500 error
app.use(function(error, request, response, next) {
response.status(500);
response.send("Error 500!");
});
server.listen(process.env.PORT || 8080, function () {
console.log('Listening on port 8080!');
});
在中间件中调用 response.end() ,就像这样
// Handle 404 error
app.use(function(request, response) {
response.status(400);
response.send("Error 404!");
response.end();
});
这就是我在我的应用程序中检查错误的方式,一个中间件
app.use((err, req, res, next) => {
if (err.statusCode === 403) {
res.statusCode = 403;
var out = {
message: 'missing/invalid authorization: ' + err.message,
code: err.code,
statusCode: err.statusCode
};
res.end(JSON.stringify(out));
return;
}
next(err);
});
如果一个中间件没有结束请求,它必须将请求转发给下一个中间件,所以需要调用next(),一个中间件的格式是
app.use((req, res, next) => { //我什么都没做,转发请求 next(); });
app.use((req, res, next) => { req.send('我结束了请求'); //这个中间件结束了请求 }));
我遇到了几乎相同的问题(在我的情况下,它是永远加载的 HTTP 500 页面),问题出在我自己添加的另一个中间件上,它在错误处理程序中间件之前,我忘记调用next()
:
app.use(function(req: Request, res: Response, next: NextFunction) {
closeConnFromRequestStorage()
next(); // make sure to call to call next
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.