您正在使用loginCallback出的功能(REQ,水庫,旁邊),從而REQ,水庫範圍和未來超出範圍,他們無法訪問。你可以訪問這個喜歡
router.get('/login', function(req,res,next) {
// send call to login function.
var ID= req.query.ID;
var Password = req.query.Password
function LoginCallback(err,myLoginResult){
res.json(myLoginResult);
}
ctlLogin.login(ID,Password, LoginCallback);
});
,或者如果ctlLogin功能詢問服務承諾可以使用的承諾,而不是回調
ctlLogin.login(ID,Password)
.then(LoginCallback)
.catch(console.log(err))
,或者如果你想LoginCallback功能出的功能範圍(REQ,水庫,接下來),那麼你需要通過創建一個回調函數來傳遞該函數中的res,然後通過傳遞錯誤,結果和res或者使用bind來調用LoginCallback函數。
function sendResponseToSever(res, err, myLoginResult){
if(err){
return res.send({
errors: err,
status: 500 // what ever status code you want to set
});
}
return res.json(results);
}
router.get('/login', function(req,res,next) {
// send call to login function.
var ID= req.query.ID;
var Password = req.query.Password
ctlLogin.login(ID,Password, sendResponseToSever.bind(null, res)
//using bind function
// OR
ctlLogin.login(ID,Password, function(err, myLoginResult){
sendResponseToSever(err, myLoginResult, res);
// now sendResponseToSever is a generic function which you can call
// from any route
});
});
});
但是如果你想避免回調地獄,最好的方法是使用promise。 正如你所提到的你想避免嵌套,你可以通過使用promise來避免它。
請參閱https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Promise如果你想了解的承諾
*「這是不好的使用
bind
您的代碼重寫足夠我需要發送回調函數到登錄方法「*爲什麼? – 4castle
我想同步工作。 – Dani
我的意思是,你爲什麼認爲回調是壞設計?他們是相當標準的,但如果你想要一個替代品,你可以返回一個承諾。 – 4castle