2012-09-28 48 views
1

在express.js函數中使用自定義回調的正確方法是什麼?調用函數並通過express.js傳遞迴調

下面是一個例子:

//routes/reset.js

user.save(function(err){ 
    if (err) return next(err); 
    reset.send_reset_email(req, res, user, function(req, res){ 
    req.flash('info', 'Check your email for a link to reset your password.'); 
    res.redirect('/'); 
    }); 
}); 

我應該使用什麼簽名reset.send_reset_email這才能正常工作?

這是我有:

exports.send_reset_email = function(req, res, user, next){ 
    //send email 
    transport.sendMail(options, function(err, responseStatus) { 
    if (err) { 
     console.log(err); 
    } else { 
     next(req, res); 
    //do I need to explicitly pass req, res here? 
    //is next() reserved word here? 
    } 
    }); 

}); 

我需要明確地傳遞REQ,水庫在這裏? 是下一個()保留字在這裏?

回答

2

next()接受錯誤或其他路由,並且通常被調用以繼續下一個中間件。

在你的send_reset_email函數中,next()不是express的next(),因爲你傳入函數(req,res)而不是下一個,傳遞你自己的回調,而不是處理sendmail函數的結果。

user.save(function(err){ 
    if (err) return next(err) // if thats express's next() 
    reset.send_reset_email(req, res, user, function(err, data){ 
    if(err) { 
     // send err msg 
    } else { 
     req.flash('info', 'Check your email for a link to reset your password.'); 
     res.redirect('/'); 
    } 
    }); 
}); 


xports.send_reset_email = function(req, res, user, cb){ 
    //send email 
    transport.sendMail(options, function(err, responseStatus) { 
    if (err) return cb(err) 
    cb(null,responseStatus) 
    }) 
})