2017-05-27 5 views
1

私は、HerokuでホストされているExpress.js/Node.jsのウェブサイトを持っています。ファイルが見つからない場合、サーバーは404エラーを送信するはずです(ほとんどのWebサイトと同じように)。しかし、私のコードのエラーハンドラは正しく動作しません。クライアントが存在しないファイルを要求すると、ページはロードされ、ロードされ、ロードされます。永遠にロードされます。ファイルが見つからないとサーバーが読み込みを停止するようにするにはどうすればよいですか?404が存在する場合、Webページはいつまで読み込まれますか?

これは私の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のエラーコードを処理し、2番目のものは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

ので

// Handle 404 error 
app.use(function(request, response) { 
    response.status(400); 
    response.send("Error 404!"); 
    response.end(); 
}); 

これは、私は私のアプリでエラーをチェックする方法1つのミドルウェアです

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); 
     }); 
  • チェックのようなあなたのミドルウェアでコールResponse.Endの()、あなたのミドルウェアが実際に呼び出されると、console.logは十分であるはずです
  • ミドルウェアが要求を終了しない場合、次のミドルウェアに要求を転送する必要があるため、next()を呼び出す必要があります。ミドルウェアの形式は

    app.useです(req、res、next) => { //私は何もしていない、要求を転送する next(); });

    app.use((REQ、RES、次)=> { req.send( '私はリクエストを終了'); //このミドルウェアは、要求 を終了}))。

+0

残念ながら、これは機能しません。エラーハンドラの最後に 'res.end()'を呼び出すことは効果がありません。そして、この回答(https://stackoverflow.com/questions/20355136/must-res-end-be-called-in-express-with-node-js)によると、 'res.send()'を呼び出すことは 'res .end() 'を自動的に実行します。それ以外に何が問題を引き起こしているのでしょうか? –

+0

更新された回答を表示 – patentul

関連する問題