我是 Passport 和 TSOA 的新手。我正在尝试将旧的 Express 路由迁移到 TSOA 控制器,但我不知道如何实现这一点。我没有找到任何关于此的文档,事实上,我找到了 this issue,但我认为我需要一个解决方法。
router.post(
'/register',
(req: Request, res: Response, next) => {
const user: IUserData = req.body
if (validator.isEmpty(email))
return res.status(422)
.json({ error: 'Email is mandatory' })
if (validator.isEmpty(password.trim()))
return res.status(422)
.json({ error: 'Password is mandatory' })
next()
},
passport.authenticate('local'),
async (req: Request, res: Response) => {
if (req.user)
return res.json({ message: 'Already logged in' })
const existingUser: IUser = await UserModel.findOne({ email: req.body.email })
if (existingUser)
return res.status(400)
.json({ error: 'User exists' })
const data: IUserData = req.body
try {
const hashedPassword = await bcrypt.hashSync(data.password, parseInt(process.env.SALT_ROUNDS) || 10)
data.password = hashedPassword
} catch(error) {
return res.status(500)
.json({ error: error.message })
}
try {
const user: IUser = await new User(data)
await user.save()
res.json(user);
} catch(error) {
return res.status(500)
.json({ error: error.message });
}
return;
}
);
我曾尝试将此代码“复制”到 TSOA 控制器中,但我不知道如何应用中间件:
@Route('/auth')
export class AuthController extends Controller {
@Post()
public async register(@BodyProp() user: IUserData) {
const errors: Array<IAuthError> = []
if (validator.isEmpty(user.emailAddress)) {
this.setStatus(422)
return { error: 'Email is mandatory' }
}
if (validator.isEmpty(user.password.trim())) {
this.setStatus(422)
return { error: 'Password is mandatory' }
}
}
}
// to be continued ...
我也可以在不同的文件(没有任何控制器)中分离这个特定的路由,但我不知道这是否有效。我想不会。
我应该如何管理这个?
我刚刚阅读了关于 TSOA 身份验证的 this article,它似乎通过使用中间件来处理身份验证。