2016-12-01 7 views
0

私のnode.js &エクスプレスアプリケーション用のルートを作成しようとしていて、少し問題があります。node.js async dbの検索後にエクスプレス、リダイレクト、またはファイルを送信

ロジックはこれです:

  1. ユーザータグiが新しいユニークタグと設定されたURLをロールが存在する場合、タグがすでに
  2. が存在する場合は、特別なタグID /6758HDE
  3. でウェブサイトを入力し、私は非同期デシベルでご確認くださいそれに
  4. あれば、それはこれまでのところ、これは

と私は現在のタグと設定されたURLを許す存在doesntのタグ私のコード:

app.get('/*', function(req, res) { 
    check_in_db(req.url, function(result) { 
     if(result) { 
      res.sendFile(__dirname + '/index.html'); 
     } else { 
      res.redirect('/' + roll_new_id()); 
     } 
    }); 
}); 

私はヘッダがすぐに送らなければならないが、私はこのような状況に対処するためのnext()のようなものがあったことを覚えて、それは非同期DB検索を行いますが、私の知識があるので、そのコードが動作していないと思います非常に弱いですが、誰かが私を正しい方向に向けることができ、意図したとおりに動作するようにコードを変更する方法を示すことができます。

+0

リダイレクト後に次回は試してみませんか?非同期の場合は、それもそこに到達するはずです。 –

答えて

0

res.redirectは、roll_new_id関数呼び出しが新しいid値を返す前に発生します。この問題を回避するには、まずroll_new_idにコールし、新しいIDの作成が完了したらコールするコールバック関数を渡す必要があります。新しいid値が作成されると、新しいid値を引数として渡すコールバック関数を実行します。 roll_new_idに渡されるコールバック関数の中では、res.redirectは、コールバック関数の実行時にroll_new_idから渡された新しいid値を使用して行います。これは理にかなっていますか?

function roll_new_id(callbackFunction){ 

    var new_id; 

    // create the new id... 

    // pass new_id to the callback function.. 
    callbackFunction(new_id); 

} 

app.get('/*', function(req, res) { 

    check_in_db(req.url, function(result) { 

     if(result) { 

      res.sendFile(__dirname + '/index.html'); 

     } else { 


      roll_new_id(function(theNewId){ 

       // this is the callbackFunction 
       // called from inside the roll_new_id function 

       res.redirect('/' + theNewId); 

      }) 

     } 
    }); 
}); 

また、このようにそれを書くことができます:あなたがこれを行うnext機能を使用したい場合は

function rollNewIDCallbackFunction(theNewId) { 

    // this is the callbackFunction 
    // called from inside the roll_new_id function 

    res.redirect('/' + theNewId); 

} 

roll_new_id(rollNewIDCallbackFunction); 

app.get('/*', function(req, res, next) { 

    check_in_db(req.url, function(result) { 

     if(result) { 

      res.sendFile(__dirname + '/index.html'); 

     } else { 

      next(); // call middleware to roll new id 

     } 
    }); 

}, function(req, res){ // middleware to roll the new id 

    function rollNewIDCallbackFunction(theNewId) { 

    // this is the callbackFunction 
    // called from inside the roll_new_id function 

    res.redirect('/' + theNewId); 

    } 

    roll_new_id(rollNewIDCallbackFunction); 

}); 
+0

'next()'の例の答えはうまくいった;)ありがとう! –

+0

ようこそ。ありがとう。 –

関連する問題