2017-12-02 3 views
0

私は約束のチェーンにresパラメータ(投稿要求から)を渡す方法を把握しようとしています。私は次のコードを持っています:pg-promise:約束を返すことを

router.post("/", (req, res) =>{ 
let email = req.body.username; 
let pass = req.body.password; 

conn.any("SELECT * FROM users WHERE email = $1", [email]) 
    .then((user)=>{ 
     if (user.length ===0){ 
      console.log("no user found"); 
      res.redirect("/"); 
     } else { 
      console.log(res); 
      bcrypt.compare(pass, user[0].password, (isMatched) =>{ 
       console.log(res); 
       if (isMatched){ 
        console.log("Horraaayyy!!!"); 
        res.redirect("/"); 

        return true; 
       } else { 
        console.log("Nope!!!"); 
        res.redirect("/"); 
       } 

      }) 
     } 
    }) 
    .catch(err =>{ 
     console.log("error: " + err) 
     res.redirect("/"); 

}); 

});あなたは急行があなたを呼び出す場合を除きRESが未定義することはできません投稿のコードでは、すべての.then文

+1

あなたは解像度が範囲外であると思わせる何か? – HMR

+0

I console.log(res)を実行すると、resが定義されていません –

+1

再現できません。あなたは[mcve]を作ってくれますか? 'res'は約束のコールバック内でのみ定義されています - あなたも同様にそれを外部に記録しようとしましたか? – Bergi

答えて

0

後.then最初の文の後

、RESスコープ外になり、私は(res.renderする方法を見つけ出すことはできません) resの値が未定義のコールバック。ここで

は、あなたのコードが正しく配置される:

router.post(
    "/", 
    (req, res) => { 
    //assuming express app and res is not undefined 
    console.log("res is here:",res); 
    let email = req.body.username; 
    let pass = req.body.password; 
    conn.any("SELECT * FROM users WHERE email = $1", [email]) 
    .then((user)=>{ 
     if (user.length ===0){ 
     console.log("no user found"); 
     res.redirect("/"); 
     } else { 
     //impossible your res is undefined here 
     console.log(res); 
     bcrypt.compare(pass, user[0].password, (isMatched) =>{ 
      console.log(res); 
      if (isMatched){ 
       console.log("Horraaayyy!!!"); 
       res.redirect("/"); 
       return true; 
      } else { 
       console.log("Nope!!!"); 
       res.redirect("/"); 
      } 
     }); 
     } 
    }) 
    .catch(err =>{ 
     console.log("error: " + err) 
     res.redirect("/"); 
    }); 
}); 

未定義されていない解像度を持つあなたのコードは、(RESがclosureとしてスコープ内にある):

var router = { 
 
    post:(x,y)=>y(undefined,"hello world") 
 
}; 
 
var bcrypt = { 
 
    compare:(x,y,z)=>z(true) 
 
} 
 
var pass = 22; 
 

 

 
router.post(
 
    "/", 
 
    (req, res) => { 
 
    //assuming express app and res is not undefined 
 
    console.log("res is here:",res); 
 
    // let email = req.body.username; 
 
    // let pass = req.body.password; 
 
    // conn.any("SELECT * FROM users WHERE email = $1", [email]) 
 
    Promise.resolve([{password:12345}]) 
 
    .then((user)=>{ 
 
     if (user.length ===0){ 
 
     console.log("no user found"); 
 
     res.redirect("/"); 
 
     } else { 
 
     //impossible your res is undefined here 
 
     console.log("and res is now:",res); 
 
     bcrypt.compare(pass, user[0].password, (isMatched) => { 
 
      console.log("res in bcompare callback",res); 
 
      // if (isMatched){ 
 
      // console.log("Horraaayyy!!!"); 
 
      // res.redirect("/"); 
 
      // return true; 
 
      // } else { 
 
      // console.log("Nope!!!"); 
 
      // res.redirect("/"); 
 
      // } 
 
     }); 
 
     } 
 
    }) 
 
    .catch(err =>{ 
 
     console.log("error: " + err) 
 
     // res.redirect("/"); 
 
    }); 
 
});

私は疑います投稿したコードは、未定義の応答を与えるコードではありません。たぶんbcrypt.compareためのコールバックを(私はここで推測している)を比較コールバックは、あなたがそれにRESを渡す必要があります別々の機能であれば約束の解決ハンドラ(then(resolveHandler)関数)

外別々funcitonです:

var router = { 
 
    post:(x,y)=>y(undefined,"hello world") 
 
}; 
 
var bcrypt = { 
 
    compare:(x,y,z)=>z(true) 
 
} 
 
var pass = 22; 
 
var compareCallback = 
 
    res => 
 
    isMatched => { 
 
    console.log("res in bcompare callback",res); 
 
    // if (isMatched){ 
 
    // console.log("Horraaayyy!!!"); 
 
    // res.redirect("/"); 
 
    // return true; 
 
    // } else { 
 
    // console.log("Nope!!!"); 
 
    // res.redirect("/"); 
 
    // } 
 
}; 
 

 
router.post(
 
    "/", 
 
    (req, res) => { 
 
    //assuming express app and res is not undefined 
 
    console.log("res is here:",res); 
 
    // let email = req.body.username; 
 
    // let pass = req.body.password; 
 
    // conn.any("SELECT * FROM users WHERE email = $1", [email]) 
 
    Promise.resolve([{password:12345}]) 
 
    .then((user)=>{ 
 
     if (user.length ===0){ 
 
     console.log("no user found"); 
 
     res.redirect("/"); 
 
     } else { 
 
     //impossible your res is undefined here 
 
     console.log("and res is now:",res); 
 
     bcrypt.compare(
 
      pass, 
 
      user[0].password, 
 
      compareCallback(res) // pass res to compareCallback and let it return a function 
 
     ); 
 
     } 
 
    }) 
 
    .catch(err =>{ 
 
     console.log("error: " + err) 
 
     // res.redirect("/"); 
 
    }); 
 
});