快递 + TSOA + 护照

时间:2021-08-01 22:22:05

标签: javascript typescript passport.js passport-local tsoa

我是 PassportTSOA 的新手。我正在尝试将旧的 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,它似乎通过使用中间件来处理身份验证。

0 个答案:

没有答案
相关问题