2017-05-27 72 views
1

我有一個用Heroku託管的Express.js/Node.js網站。如果找不到文件,服務器應該發送404錯誤(與大多數網站一樣)。但是我的代碼中的錯誤處理程序無法正常工作。當客戶端請求一個不存在的文件時,該頁面將加載...並加載...並永久加載...。當它檢測到無法找到文件時,如何使服務器停止加載?爲什麼網頁如果有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

到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) => { //我沒做任何事,轉發請求 next(); });

    app.use((REQ,RES,下一個)=> { req.send( 'I結束請求'); // 這中間件結束請求 }));

+0

不幸的是,這是行不通的。在錯誤處理程序的末尾調用'res.end()'不起作用。根據這個答案(https://stackoverflow.com/questions/20355136/must-res-end-be-called-in-express-with-node-js)調用'res.send()'已經調用'res .end()'自動。還有什麼可能導致這個問題? –

+0

查看更新的答案 – patentul