web-dev-qa-db-ja.com

ExpressJS:res.redirect()が期待どおりに機能しませんか?

私はこれに2日間苦労し、グーグルでスタックオーバーフローをしましたが、解決できませんでした。

ホームページにリダイレクトするログインページを使用して、単純なノードアプリ(+ Express + Mongoose)を構築しています。サーバーのコーヒーコードは次のとおりです。

_app
     .get '/', (req, res) ->
         console.log "Here we are : root"
         res.sendfile(__dirname + '/index.html')


     .get '/login', (req, res) ->
         console.log "Here we are : '/login'"
         res.sendfile(__dirname + '/login.html')


     .post '/credentials', (req, res) ->
         console.log "Here we are : '/credentials'"

         # (here comes credentials validation stuff with Mongoose)

         res.redirect '/'
_

ログインページは、POST投稿されたデータが検証される/ credentialsへのリクエストを行います。これは動作します。Nodeコンソール。

次に問題が発生します。res.redirectが正しく機能しません。私はそれが「/」ルートに到達することを知っています、なぜなら:

  1. Nodeコンソールで「ここにいる:ルート」を確認できます
  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コードを表示するにはどうすればよいですか?

事前にご協力いただきありがとうございます:)

22
Jeremy Thille

問題はバックエンドではなく、フロントエンドにある可能性があります。 AJAX=を使用してPOSTリクエストを送信する場合、URLを変更しないように特別に設計されています。

AJAXのリクエストが完了した後(.done()で)window.location.hrefを使用してURLを目的のパスに更新するか、リクエストからHTMLを受け取ったときにJQuery:$('body').replaceWith(data)を使用します。

25
Kelrynn

Get/routeに以下を追加します:

  res.setHeader("Content-Type", "text/html")

ブラウザはファイルをダウンロードする代わりにレンダリングします

0
Daphoque

Expressを使用してNodeJSをNextJSアプリに実装する作業を行っています。この問題を抱えていて、これに遭遇しました。関数にevent.preventDefault()があり、それが送信するフォームを起動しており、リダイレクトも妨げていたため、それを削除し、それに応じてリダイレクトしていました。

0
nicer00ster

Mongooseを確認するために非同期呼び出しを行っていることはほぼ確実ですが、非同期呼び出しが結果を返した後にのみリダイレクトが発生するようにコードを構造化していません。

JavaScriptでは、POSTは次のようになります。

function validateCredentials(user, callback){
    // takes whatever you need to validate the visitor as `user`
    // uses the `callback` when the results return from Mongoose
}

app.post('/credentials', function(req, res){
    console.log("Here was are: '/credentials'";
    validateCredentials(userdata, function(err, data){
        if (err) {
            // handle error and redirect to credentials,
            // display an error page, or whatever you want to do here...
        }
        // if no error, redirect
        res.redirect('/');
    };
};

node.jsでの非同期呼び出しvs. mongoose のような質問も表示できます。

0