在Node.js模块中重用代码

我只是想知道你是否会重构代码,就像我在这里做的一样。 对不起,以下长的上下文。 🙂

我正在通过一个简单的networking应用程序学习Express.js,并使用重置密码表单在login页面上工作。 该表格要求input一个电子邮件,然后在数据库中检查,然后在用户configuration文件中设置令牌和1小时的过期时间,并向用户发送URL。 该URL是类似http://mywebsite.com/account/reset/43aea78ba678fd8ed746b2b0b79c34da9380a5a6所以当用户访问这个URL我有几个路由器来处理从这里重置密码:

  • 一个检查令牌: router.get( '/account/reset/:token', authController.reset )redirect到一个带有表单的新页面来重置密码。
  • 另一个更新新密码: 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

  • 这比其他解决scheme更容易testing吗?
  • 你会创build一个新的模块,只是为了保持像函数findUserByTokenAndDate这样的代码吗?
  • 这是好的做法吗?

请注意,这是一段非常简单的代码,可能不值得重用,但是我正在寻找一些更复杂或更大代码的良好实践。

谢谢!

这比其他解决scheme更容易testing吗?

取决于你问的问题。 是的,因为你在其他地方重复使用相同的逻辑,把它抽象出来是有意义的。 但是,如果只是在两个地方使用,那么你不一定有/需要提取它,以避免重复。 它节省了时间,能够在那里看到代码的逻辑,而不必追踪它所在的模块。

你会创build一个新的模块,只是为了保持像函数findUserByTokenAndDate这样的代码吗?

我将创build一个单独的模块与任何/所有的实用function,如findUserByTokenAndDate 。 然后,我可以只testing效用函数,没有别的。

这是好的做法吗?

有人会说这是过度工程 。