如何告诉 Passport JS 中的 typescript req.user 永远不会被定义?

Posted

技术标签:

【中文标题】如何告诉 Passport JS 中的 typescript req.user 永远不会被定义?【英文标题】:How to tell typescript req.user in Passport JS never will be undefined? 【发布时间】:2020-10-28 09:49:27 【问题描述】:

使用 Passport JS 时,路由中的 req.user 被视为可能未定义。但是我的路由方法之前的中间件确保不是这种情况。如何告诉打字稿?

Object is possibly 'undefined'.

例子:

someMethod = async (req: Request, res: Response) => 
  const  user  = req
  const userId: number = user.id

在上面的打字稿中抛出一个错误,因为 user.id 可能是未定义的。

我当然可以这样做:

if (!user) return
const userId: number = user.id

但我认为通过我的方法一遍又一遍地重复这段代码并不是最好的方法,因为中间件甚至在到达路由方法之前就已经这样做了。

【问题讨论】:

如果您的 TS 版本支持可选链接,可以使用 user?.id 实际上我不能,因为那会返回未定义。我实际上是在一个期望 user.id 是数字的函数中使用这个值。 TS 只是在您尝试访问 user 上的 id 之前进行空检查,因此无论如何添加它都不会有害;因为user 总是有一个值,当你尝试访问user?.id时你会得到一个值 如果您想要快速解决方案,请使用//@ts-ignore。如果你想要一个比这更优雅的解决方案,你需要扩展Express.Request 接口。 【参考方案1】:

我建议您使用您需要的参数简单地声明全局 Express 命名空间:

declare global 
  namespace Express 
    interface Request 
      user: User //or other type you would like to use
    
  

之后,您将能够在没有 //@ts-ignore 或可选链接的情况下使用 req.user

someMethod = async (req: Request, res: Response) => 
  const  user  = req
  const userId: number = user.id //user will be defined

【讨论】:

以上是关于如何告诉 Passport JS 中的 typescript req.user 永远不会被定义?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 mongo、passport 和 node js 更新用户的个人资料?

如何正确使用 Passport.js?

如何使用 Passport.js 在 Node.js 中重置/更改密码?

Sails.js + Passport.js 通过 websockets 进行身份验证

官方 Laravel Passport 包中 Vue.js 组件中的 jQuery 代码

如何在 passport-facebook / Passport.js 中捕获 FacebookAuthorizationError?