Ger*_*son 10 express typescript passport.js typescript2.0
我正在使用 Passport 处理 Express 应用程序的身份验证。这将用户设置为 Express 响应。我正在使用 TypeScript,因此在路由定义中将请求类型设置为 Request 会出错,因为 Express Request 中不存在用户对象。通过声明合并或扩展接口来扩展请求有很多问题,但这些会导致另一个错误。我的文件看起来像这样:
import { Router, Request, Response } from 'express'
import { User as CustomUser } from './user'
interface IRequest extends Request {
user: CustomUser
}
const router: Router = Router()
router.get('/', requiresLogin, (req: IRequest, res: Response) => {
console.log(req.user)
res.sendStatus(204)
})
Run Code Online (Sandbox Code Playgroud)
但现在我在快速回调中得到以下 TypeScript:
Argument of type '(req: IRequest, res: Response) => void' is not assignable to parameter of type 'RequestHandlerParams'. Type '(req: IRequest, res: Response) => void' is not assignable to type '(RequestHandler | ErrorRequestHandler)[]'. Property 'includes' is missing in type '(req: IRequest, res: Response) => void'.
Run Code Online (Sandbox Code Playgroud)
我最近升级到 TypeScript v2.8.3,以前从未遇到过这个问题。
我刚刚遇到了类似的问题并这样解决:
\n\nimport { Router, Request, Response } from \'express\';\nimport { User as CustomUser } from \'./user\';\n\nconst router: Router = Router();\n\nrouter.get(\'/\', requiresLogin, (req: Request, res: Response) => {\n console.log(req.user as CustomUser);\n res.sendStatus(204);\n});\nRun Code Online (Sandbox Code Playgroud)\n\n我没有增加 Express.js 请求类型,而是只是使用类型断言告诉 TypeScript req.user 将是 CustomUser 类型。这似乎正是文档中引用的场景“有时你\xe2\x80\x99ll最终会遇到这样的情况:你\xe2\x80\x99ll比TypeScript更了解一个值。”
\n\nhttps://www.typescriptlang.org/docs/handbook/basic-types.html#type-assertions
\n\n现在我知道你在想什么了。“如果没有用户怎么办?这不是违背了 Typescript 的目的吗?”。好吧,让我们看看这个。如果您使用 Passport.js,那么在没有用户的情况下您不应该走到这一步。此代码应该位于您的 Passport 配置中的某个位置:
\n\nif (!user) {\n /** Set status code to Unauthorized */\n res.status(401);\n\n return next(err);\n}\nRun Code Online (Sandbox Code Playgroud)\n\n至于击败 Typescript……也许你是对的。如果有人对这种情况有更好的答案,我会洗耳恭听。
\n| 归档时间: |
|
| 查看次数: |
2171 次 |
| 最近记录: |