如果有404,为什么网页会永远加载?

时间:2017-05-27 18:21:33

标签: javascript node.js http express heroku

我有一个使用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!');
});

2 个答案:

答案 0 :(得分:2)

在您的中间件中调用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);
        });
  • 检查您的中间件是否实际被调用,console.log应该足够
  • 如果中间件没有结束请求,它必须将请求转发到下一个中​​间件,所以你需要调用next(),中间件的格式是

    app.use((req,res,next)=> {   //我没有做任何事情,转发请求   下一个(); });

    app.use((req,res,next)=> {     req.send('我结束了请求');     //这个中间件结束了请求 }));

答案 1 :(得分:0)

我遇到了几乎相同的问题(在我的情况下,这是永远加载的HTTP 500页面),问题是我添加了自己的另一个中间件,该中间件在错误处理程序中间件之前,并且在其中 >我忘了打电话给next()

app.use(function(req: Request, res: Response, next: NextFunction) {
  closeConnFromRequestStorage()
  next(); // make sure to call to call next
});