1. ホーム
  2. Web プログラミング
  3. ジャバスクリプト

[解決済み】ExpressJS : res.redirect()が期待通りに動かない?

2022-01-01 12:05:58

質問

expressとMongooseを使ってログイン機能を実装したいのですが、コードは以下の通りです。

app
    .get('/', (req, res) => {
        console.log("Here we are : root");
        return res.sendfile(__dirname + '/index.html');
    })
    .get('/login', (req, res) => {
        console.log("Here we are : '/login'");
        return res.sendfile(__dirname + '/login.html');
    })
    .post('/credentials', (req, res) => {
        console.log("Here we are : '/credentials'");
        // Some Mongoose / DB validations
        return res.redirect('/');
    });

ログインページがPOSTリクエストを /credentials 投稿されたデータは検証されます。これは動作します。ここで、"Here we are .を見ることができます。'/credentials'" がNodeコンソールに表示されます。

次に問題なのは、res.redirectが正しく動作しないことです。私はそれが'/'ルートに到達することを知っています、なぜなら。

  1. Node コンソールで "Here we are : root" を見ることができます。
  2. index.htmlのページがレスポンスとしてブラウザに送り返されていますが、ウィンドウに表示されていません。Chrome のインスペクタには POST リクエストのレスポンスが表示され、インスペクタでブラウザに送信される HTML コードを確認できますが、URL は /login のままで、ログインページが画面上に表示されたままになっています。

(編集) リダイレクトはMongooseのコールバック関数にあり、(NodeJSがそうであるべきように)同期的ではありません。わかりやすくするために、Mongooseのバリデーションに関するものを削除したところです。

を追加してみました。 res.end() しかし、それはうまくいきません。

試してみたところ

req.method = 'get'; 
res.redirect('/');

そして

res.writeHead(302, {location: '/'});
res.end();

しかし、それは動作しません

何が間違っているのでしょうか?どうすれば実際に '/login' ページを離れ、ブラウザを '/' にリダイレクトし、受け取った HTML コードを表示できるのでしょうか?

解決方法は?

問題は、バックエンドではなく、フロントエンドにあるのかもしれません。POSTリクエストを送信するためにAJAXを使用している場合、それは特にあなたのURLを変更しないように設計されています。

使用方法 window.location.href は、AJAX のリクエストが完了した後 ( .done() ) を使って URL を希望のパスに更新するか、JQuery を使ってください。 $('body').replaceWith(data) リクエストから戻ってきたHTMLを受け取るとき。