我只想知道您是否會按照我在這裏所做的相同方式重構代碼。對不起,以下長的上下文。 :)在Node.js模塊中重複使用代碼
我正在學習Express.js與一個簡單的網絡應用程序,並在重置密碼錶單的登錄頁面上工作。該表格要求輸入一個電子郵件,該電子郵件將根據數據庫進行檢查,然後在用戶配置文件中設置令牌和1小時的過期時間,並將URL發送給用戶。該URL是一樣的東西http://mywebsite.com/account/reset/43aea78ba678fd8ed746b2b0b79c34da9380a5a6
這樣當用戶訪問這個網址我有一對夫婦的路由器從這裏處理密碼重置:
- 一個檢查令牌:
router.get('/account/reset/:token', authController.reset)
其重定向到一個新頁面的表單重置密碼。 - 和對方更新新密碼:
router.post('/account/reset/:token', authController.confirmedPasswords, authController.update )
這裏是一個要處理這些任務的邏輯模塊(控制器):
const mongoose = require('mongoose')
const User = mongoose.model('User')
const promisify = require('es6-promisify')
const findUserByTokenAndDate = (token, date) => {
return User.findOne({
resetPasswordToken: token,
resetPasswordExpires: { $gt: date },
})
}
exports.reset = async (req, res) => {
// const user = await User.findOne({
// resetPasswordToken: req.params.token,
// resetPasswordExpires: { $gt: Date.now() },
// })
const user = await findUserByTokenAndDate(req.params.token, Date.now())
if (! user)
{
req.flash('error', 'Password reset token is invalid or has expired')
return res.redirect('/login')
}
res.render('reset', { title: 'Reset your Password' })
}
exports.confirmedPasswords = (req, res, next) => {
if (req.body.password === req.body['password-confirm'])
{
return next()
}
req.flash('error', 'Passwords do not match!')
res.redirect('back')
}
exports.update = async (req, res) => {
// const user = await User.findOne({
// resetPasswordToken: req.params.token,
// resetPasswordExpires: { $gt: Date.now() },
// })
const user = await findUserByTokenAndDate(req.params.token, Date.now())
if (! user)
{
req.flash('error', 'Password reset is invalid or has expired')
return res.redirect('/login')
}
const setPassword = promisify(user.setPassword, user)
await setPassword(req.body.password)
user.resetPasswordToken = undefined
user.resetPasswordExpires = undefined
const updateUser = await user.save()
await req.login(updateUser) // This is to tell password.js which user to log in
req.flash('success', 'Your password has been reset! You are now logged in')
res.redirect('/')
}
註釋代碼是一個我與函數findUserByTokenAndDate
重複使用。
- 這比其他解決方案更容易測試嗎?
- 您是否已經創建了一個新模塊,僅用於保存函數
findUserByTokenAndDate
中的代碼? - 這是一個很好的做法嗎?
請注意,這是一段非常簡單的代碼,甚至可能不值得重用,但我正在尋找一些更復雜或更大代碼的良好實踐。
謝謝!