[英]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.