1. ホーム
  2. node.js

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

2022-01-30 17:10:07

質問

2日前からこの問題で悩んでいます。ググったり、stackoverflowで調べたりしたのですが、解決できません。

私は、ホームページへリダイレクトするログインページのあるシンプルなnodeアプリ(+Express + Mongoose)を作っています。これが私のサーバーJSコードです。

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 コードを表示できますか?

事前に100万人の助けをありがとうございました :)

解決方法は?

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

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