簡體   English   中英

使用 Typescript 時如何在 Express req object 中添加自定義屬性

[英]How to add custom property in Express req object when using Typescript

我正在嘗試將用 JavaScript 編寫的用戶身份驗證 API 轉換為 TypeScript。 如果用戶通過身份驗證,我的身份驗證中間件會將“用戶對象”添加到“請求對象”,現在當我嘗試在控制器中訪問它時,TypeScript 給出錯誤“請求類型不存在屬性用戶”

我試過了 -

declare global {
    namespace Express {
        export interface Request {
            user?: any;
        }
    }
}

但是,如果我給出“任何”作為類型,那么定義我使用 TypeScript 的類型的含義是什么...

路由器 -

import express, { Router, Request, Response } from "express";

const router: Router = express.Router();

const userController = require("./../controllers/userController");
const auth = require("./../middleware/auth");

router.patch("/change-password", auth, userController.changePassword);

身份驗證中間件 -

const verifyJWT = async (req: Request, res: Response, next: NextFunction) => {
    try {
        const accessToken = req.headers["x-access-token"];
        if (!accessToken)
            return res.status(401).json({ error: `Token is required.` });

        const decodedToken = await jwt.verify(
            accessToken,
            config.ACCESS_TOKEN_KEY
        );
        if (!decodedToken)
            return res.status(403).json({ error: `Invalid Token.` });

        const user = await User.findOne({ _id: decodedToken._id, accessToken });
        if (!user) return res.status(400).json({ error: `No user found.` });

        req.user = user;
        req.accessToken = accessToken;

        next();
    } catch (err: any) {
        console.log("--MSG--" + err.message + "--NAME--" + err.name);

        if (err.name === "TokenExpiredError") {
            return res.status(401).json({
                error: "invalid_token",
                message: "The access token expired",
            });
        }

        res.status(500).json({
            error: "authentication_error",
            message: "Error while authenticating",
        });
    }
};
module.exports = verifyJWT;

Controller -

const changePassword: Function = async (req: Request, res: Response) => {
    try {
        // The auth middleware sets req.user with the user's document so I can use user document to Query the database.

        const { currentPass, newPass, confirmPass } = req.body;

        if (!currentPass || !newPass || !confirmPass) {
            return res
                .status(400)
                .json({ error: `Please fill all the required fields` });
        }

        if (newPass !== confirmPass) {
            return res.status(400).json({
                error: `New password doesn't match confirmation password`,
            });
        }

        if (req.user) {
            if (await bcrypt.compare(currentPass, req.user.password)) {
                req.user.password = newPass;
                await req.user.save();
                return res
                    .status(200)
                    .json({ result: 1, message: resMsgs.success.s4 });
            } else {
                return res.status(400).json({ error: `Wrong password` });
            }
        }
    } catch (err: any) {
        console.log(err.message);
        res.status(500).json({ error: `Something went wrong` });
    }
};

在 typescript 中,您可以聲明節點模塊的導出內容。

如果節點模塊沒有它自己的類型,或者如果你想修改它的類型,你可以簡單地創建額外的聲明,如下所示:

declare module 'express'
{
    export interface Request
    {
        // if you're using mongoose
        user?: HydratedDocument<IUser>

        // if you're not using mongoose
        user?: IUser
    }
}

export interface IUser
{
    id: string
    name: string
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM