gpt4 book ai didi

javascript - 在 Node.js 模块中重用代码

转载 作者:行者123 更新时间:2023-11-30 21:21:31 25 4
gpt4 key购买 nike

我只想知道您是否会像我在这里所做的那样进行重构以重用代码。抱歉,以下内容很长。 :)

我正在通过一个简单的 Web 应用程序学习 Express.js,并在使用重置密码表单的登录页面上工作。此表单要求提供一封电子邮件,根据数据库检查该电子邮件,然后在用户配置文件中设置 token 和 1 小时的过期时间,并将 URL 发送给用户。网址类似于 http://mywebsite.com/account/reset/43aea78ba678fd8ed746b2b0b79c34da9380a5a6所以当用户访问这个 URL 时,我有几个路由器来处理从这里重置的密码:

  • 一个检查 token :router.get( '/account/reset/:token', authController.reset )它重定向到一个新页面,其中包含一个用于重置密码的表单。
  • 另一个更新新密码:router.post( '/account/reset/:token',
    authController.confirmedPasswords,
    authController.update
    )

这是具有处理这些任务的逻辑的模块( Controller ):

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
  • 这是好的做法吗?

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

谢谢!

最佳答案

Is this more testable than other solutions?

取决于你问的是谁。对我来说是的,因为你在其他地方重用相同的逻辑,将它抽象成它自己的功能是有意义的。但是,如果它只在两个地方使用,那么您不必/不需要提取它以避免重复。能够立即查看代码的逻辑,而不必查找代码所在的模块,这样可以节省时间。

Would you have created a new module, just for keeping code like the one in the function findUserByTokenAndDate?

我会创建一个单独的模块,其中包含任何/所有实用函数,例如 findUserByTokenAndDate。然后我可以只测试实用函数而不测试其他任何东西。

Is this good practice?

有人会说它是over-engineering .

关于javascript - 在 Node.js 模块中重用代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45135218/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com