2016-12-10 11 views
1

私はnodejs/expressjsにショッピングカートアプリケーションを構築しています。ユーザーがサインインした後、正しいページにリダイレクトする際に問題が発生しています。私は密接に関係するいくつかの記事を見つけましたが、それらの記事から修正しようとする私の試みはすべてこのトリックを行っていません。NodeJS/ExpressJSで正しくリダイレ​​クトする方法は?

access: function(req, res){ 
    var data = JSON.parse(req.body.data); 
    console.log(data); 
     Customers.findOne({"custEmail": data.custEmail}, function(err, user){ 
     if(err){ 
      console.log(err); 
      res.send("error"); 
     }if(!user){ 
      console.log("user not found"); 
      res.send("error"); 
     }else{ 
      console.log("user found"); 
      bcrypt.compare(data.custPassword, user.custPassword, function(err, reponse){ 
      if(reponse){ 
       req.session.regenerate(function(err){ 
       if(err){ 
        console.log(err); 
        res.send("error"); 
       }else{ 
        req.session.success = true; 
        res.send("Success"); 
        //res.redirect('/'); 
       } 
       }); 
      }else{ 
       console.log("error"); 
      } 
      }); 
      } 
     }); 

ユーザーはログイン情報を入力してログインボタンをクリックします。 Ajaxリクエストは、このアクセス関数にデータを送信します。この関数は、ユーザーがデータベースに存在するかどうかを調べることから始まります。それがbcryptパスワードを比較し続けている場合、それらが等しい場合には正常にログインし、そうでない場合は明らかにエラーになります。

問題はここにあるように思わ:}else{ req.session.success = true; res.send("Success"); //res.redirect('/'); }

ユーザーのメールアドレスとパスワードが一致し、これは右ここにヒットした場合。このセッションをtrueに設定すると、ユーザーはこのセッションが必要なページにアクセスし、ajaxリクエストにSuccessメッセージを返します。これは現在完全にうまく動作し、res.sendはフロントエンドに送られます。 res.redirectのコメントを外すと、「設定された後にヘッダーを設定できません」という予期した結果が発生します。ですからres.sendをコメントアウトするとres.redirectはまったく動作しなくなります。エラーはありません。

ここでこのリダイレクトが機能しないのはなぜですか?ヘッダーはこの関数のどこにも設定されておらず、リダイレクトは完全に正常に動作するはずです。どんな助けでも大歓迎です。ありがとう。

答えて

6

ajax呼び出しを送信して応答を受け取ると、ブラウザはそのajax応答に基づいてブラウザの現在のページに何もしません。したがって、ajax呼び出しにリダイレクト応答を送信するかどうかは関係ありません。ブラウザはブラウザの現在のページを変更しません。 AjaxレスポンスはあなたのJavascriptのためのデータを生成し、あなたのJavascriptはそれをどうするか決定する必要があります。

こちらのブラウザでは、ブラウザページリクエストまたはブラウザから送信されたフォーム投稿からリダイレクトが発生したときのみ、現在のページが変更されます(Javascriptは送信されません)。これはログインの方法ではないので、リダイレクトを使用して現在のブラウザページを変更することはできません。

クライアントでajax呼び出しを使用してログインする場合、Ajaxログインが成功した後にクライアントがページを変更するようにするには、ログイン応答でリダイレクトURLを送信し、クライアントはそれを処理し、ログイン時にリダイレクトを行うようにwindow.locationを設定します。これに

res.send("Success"); 

たとえば、あなたが変更される可能性が

res.json({status: "Success", redirect: '/'}); 

そして、その後、あなたのクライアントコードを持っているAJAX呼び出しからの戻りを調べるステータスが成功した場合、それをリダイレクトプロパティを取得し、同じような何かを行うことができます。

if (ajaxResult.status === "Success") { 
    window.location = ajaxResult.redirect; 
} 

ここでこのリダイレクトが機能しない理由が不思議です。ヘッダーは で、この関数のどこにも設定されておらず、期待される結果の は、リダイレクトが完全に正常に機能するはずです。どんな助けでも が大変に感謝しています。

ヘッダーについてのメッセージは、すでに全体のレスポンスがすでにres.send("Success");で送信され、あなたが今、別の応答を送信しようとしていることを意味送られてきました。特定のリクエストに対して1つの応答しか得られません。 res.send("Success");を実行すると、httpサーバオブジェクトは応答全体を送信し、その応答を閉じます。その時点でさらにデータを送信することはできません。

+0

ありがとうございます。あなたの最初の最初のresposneは私のために十分でした。私は100%必要ではなかったので、Ajaxリクエストを削除するだけでした。私はAjaxの作品が好きなので、ここでそれを使うと思った。代わりに、私はAjaxを取り出し、フォームの提出時にページからreq.body.dataを取得しました。それから、そこに正しいリダイレクトを置くだけで簡単でした。あなたのタイムリーかつ非常に有益な答えを感謝してください! – Zgbrell

+0

あなたの応答から何かを変更または削除したくないのですが、このステートメントを大胆にしたい場合:リダイレクトは、ajax呼び出しでは処理されないため、通常はリダイレクトは適用されません(ブラウザはページ上のリダイレクトを処理します負荷またはフォームのポストレスポンス)。あなたの応答でそれは優れています。この文章だけで、この特定のケースでAjaxを使用しないことに決めました。 – Zgbrell

+0

あなたもこの投稿を見てみませんか? [リンク](http://stackoverflow.com/questions/41089118/how-to-make-a-successful-ajax-request-using-javascript-on-page-load) – Zgbrell

関連する問題