#node.js #typescript #express #jwt #express-jwt
#node.js #typescript #экспресс #jwt #express-jwt
Вопрос:
Я пытаюсь реализовать экспресс-API, который проверяет подлинность с помощью токена jwt, и я использую промежуточное программное обеспечение express-jwt для аутентификации доступа к методу:
import express from 'express'
import jwt from 'express-jwt'
const app = express()
app.get('/protected', jwt({ secret: 'jwtSecret', algorithms: ['HS256'] }), prot)
const prot = (
req: express.Request,
res: express.Response,
_next: express.NextFunction
): void => {
res.json({
msg: req.user,
})
}
app.listen(3000)
Но я получаю эту ошибку:
Property 'user' does not exist on type 'Request<ParamsDictionary, any, any, ParsedQs>'.ts(2339)
Я попытался подключиться req: express.Request amp; { user: unknown }
, но тогда функция больше не подходит для express.
Любые идеи, что я могу здесь сделать. Если ситуация ухудшится, могу ли я просто сказать TypeScript, чтобы он как-то заткнулся, поскольку я знаю, что поле будет там (хотя я знаю, что это не суть TypeScript)
Комментарии:
1. Было бы неплохо увидеть
ExpressJWTRequest
объект, экспортированный из@types/express-jwt
, но, к сожалению, для этого, похоже, ничего нет: (
Ответ №1:
user
не является существующим свойством req
объекта. Вы можете создавать свои собственные типы для req
object, создавая .d.ts
файл в своем проекте, например, создайте express.d.ts
файл, и он будет содержать:
declare namespace Express {
export interface Request {
user: SomeType
}
}
Демонстрация: https://repl.it/repls/OldlaceWhoppingComputationalscience
Попробуйте удалить express.d.ts
, и ошибка появится снова.
Комментарии:
1. Если я создаю тип
declare namespace ExpressJWT { export interface JWTRequest extends express.Request { user: unknown } }
, я получаю(property) ExpressJWT.JWTRequest.user: unknown Object is of type 'unknown'.ts(2571)
2. Я уже пробовал что-то подобное, и это тоже не сработало
3. Предполагается, что пространство имен должно быть
Express
, а неExpressJWT
, вы пробовали мое? Проверьте мой repl.it
Ответ №2:
declare global {
namespace Express {
interface Request {
user?: UserPayload;
}
}
}
это пример пользовательского интерфейса
interface UserPayload {
id: string;
email: string;
}