0

私はノードを使用しており、クライアントが自分自身を承認した後にクライアントをリダイレクトしようとしています。このため、クライアント側で ajax を使用して POST メソッドを使用しています。これは次の形式です。

$.ajax({
    type: "POST",
    url: '/login',
    dataType: "json",
    async: false,
    beforeSend: function(xhr) {
        xhr.setRequestHeader("Authorization", "Basic " + btoa(credentials.username + ":" + credentials.password));
    },
    data: credentials,
    success: function () {
        window.alert("Success! (whatever that means)");
    }
});

次に、サーバー側でコマンドを使用して実際のページにリダイレクトしようとしています

app.get('/login', loginInternalApp);
app.post('/login', function (req, res){
    var postContents = req.body;
    req.session.username = postContents.username;
    res.redirect('/my_secret_page');
});
app.get('/my_secret_page', checkAuth, function (req, res) {
    console.log("sending the message!");
    res.send('if you are viewing this page it means you are logged in');
    res.end();
});

checkAuth はここから取られました node.js でログイン認証を実装する方法(user_id の代わりにユーザー名を使用しています。それは問題ではありません)。

おそらく、私が知らないのは、この ajax 呼び出しを正しく処理する方法です。私はいくつかのコンソール メッセージを出力し、サーバーは res.send('このページを表示している場合...') まで進みますが、クライアントでは何も起こりません。次に、control-C を押してサーバーを終了すると、警告ウィンドウがポップアップします。一方、成功時に渡された関数にはパラメーターを指定できることがわかります (推測: errorCode、errorString、otherData など)。

それで、私は何を間違っていますか?

4

1 に答える 1

3

ここでの問題は、JavaScript を利用したナビゲーションとサーバーのリクエスト/レスポンスを利用した単純なナビゲーションの概念を少し混同していることです。これを少し見て、もっと意味があるかどうか見てみましょう。

ログイン フォームを送信するために ajax を使用しています。つまり、現在のページにとどまり、JavaScript を使用して http 要求を送信し、応答を収集します。を配置するPOSTと、サーバーがユーザーをログインさせ3XX、リダイレクトを示す を返します。JavaScript が応答を収集します。これは、「ネットワーク」タブでインスペクターを開くと確認できます。しかし、JavaScript で応答を収集しているだけなので、ページはどこにも行きません。

この場合、いずれかを選択する必要があります。JavaScript を使用してルーティングを処理するか (バックボーンのようなツールは、このような場合に非常に便利で、適切なルーティング クラスが付属しています)、ajax ではなく通常どおりログイン フォームを送信します。ユーザーがボタンを押したときにフォームを送信し、JS でそれをキャッチしない場合、これで問題が解決するはずです。サーバーからリダイレクトを返すと、ページは期待どおりにリダイレクトされます。または、リダイレクト応答を送信するのではなく、成功または失敗を示す JSON を送り返し、JavaScript を使用して適切なビューを表示することもできます。これにより、問題も解決されます。

サーバー側のコードを見ると、ここで ajax を使用している理由は、認証ヘッダーを設定するためだと思います。内部認証機能を非表示にしたため、なぜそれらが必要なのかわかりませんが、通常のフォーム送信ではデフォルトでこれらのカスタム セット ヘッダーがないという ajax を使用しないと問題が発生する可能性があります。同じ情報を収集して同じ方法で移動する方法は確かにあります (ヘッダーを設定したり、他のメソッドに委任したり、エクスプレスから http 要求を送信したりすることもできます)、具体的にどのように処理しているかについての詳細が必要です。ログインして、その部分を合理化する方法についてアドバイスしてください:)

于 2013-10-24T15:21:39.753 に答える