2017-07-17 73 views
1

我只想知道您是否會按照我在這裏所做的相同方式重構代碼。對不起,以下長的上下文。 :)在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中的代碼?
  • 這是一個很好的做法嗎?

請注意,這是一段非常簡單的代碼,甚至可能不值得重用,但我正在尋找一些更復雜或更大代碼的良好實踐。

謝謝!

回答

1

這是比其他解決方案更容易測試嗎?

取決於你問誰。對我來說是的,因爲你在其他地方重複使用相同的邏輯,所以將它抽象爲它自己的功能是有道理的。但是,如果它只在兩個地方使用,那麼您不一定需要提取它以避免重複。這樣可以節省時間能夠看到代碼的邏輯就在那裏,而不是追查它的模塊。

你已經創建了一個新的模塊,只需在功能findUserByTokenAndDate保持代碼就像一個?

我會創建一個單獨的模塊與任何/所有的實用功能,如findUserByTokenAndDate。然後,我可以只測試效用函數而沒有其他的東西。

這是一個很好的做法嗎?

有人會說這是over-engineering