2017-12-02 8 views
0

나는 (post 요청에서) res 매개 변수를 promise chain으로 전달하는 방법을 찾으려고합니다. 다음 코드가 있습니다 :pg-promise : prom에 res 전달

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("/"); 

}); 

}); 그 때는 첫 번째 문 후

는 입술 범위를 벗어난되고, 표현이 호출하지 않는 한 I는 정의 할 수없는 모든 그 때는 문이 입술을 게시 코드에서

+1

당신은 입술 어떤 범위를 벗어난 생각하게? – HMR

+0

내가 console.log (res) 할 때 - 해상도가 정의되지 않은 것을 인쇄합니다. –

+1

재현 할 수 없습니다. 너는 [mcve]를 만들 수 있니, 제발? 'res'는 promise 콜백 내에서만 정의되지 않았습니까 - 외부에서도 로그 아웃하려고 했습니까? – Bergi

답변

0

후() 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("/"); 
    }); 
}); 

정의되지 않은되지 고해상도와 코드 (입술 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에 대한 콜백은 약속 해결 핸들러 외부에 별도의 funciton합니다 ( then(resolveHandler) 기능)

입니다 :

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("/"); 
 
    }); 
 
});