导入express-jwt解析token字符串可能遇到的问题

  今天在学习黑马Node.js课程时候 在导入express-jwt模块解析客户端发来的token字符串时报了如下的错误:

TypeError: app.use() requires a middleware function
    at Function.use (C:\Users\Administrator\Desktop\黑马Node\node_modules\express\lib\application.js:210:11)    at Object.<anonymous> (C:\Users\Administrator\Desktop\黑马Node\Day6\jwt案例\test.js:13:5)
    at Module._compile (node:internal/modules/cjs/loader:1546:14)
    at Object..js (node:internal/modules/cjs/loader:1689:10)
PS C:\Users\Administrator\Desktop\黑马Node\Day6\jwt案例> node .\test.js            
C:\Users\Administrator\Desktop\黑马Node\Day6\jwt案例\test.js:23
app.use(expressJWT({ secret: secretKey }).unless({ path: [/^\/api\//] })) //配置不需要访问权限的接口路径
        ^

TypeError: expressJWT is not a function
    at Object.<anonymous> (C:\Users\Administrator\Desktop\黑马Node\Day6\jwt案例\test.js:23:9)
    at Module._compile (node:internal/modules/cjs/loader:1546:14)
    at Object..js (node:internal/modules/cjs/loader:1689:10)
    at Module.load (node:internal/modules/cjs/loader:1318:32)
    at Function._load (node:internal/modules/cjs/loader:1128:12)
    at TracingChannel.traceSync (node:diagnostics_channel:315:14)
    at wrapModuleLoad (node:internal/modules/cjs/loader:218:24)
    at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:170:5)
    at node:internal/main/run_main_module:36:49

Node.js v22.11.0

  询问豆包后,提示我有如下两点错误:

  1.app.use() requires a middleware function 错误

   错误表明我尝试将一个非中间件函数传递给app.use()方法,我想可能是这段代码出错误了:

const expressJwt = require("express-jwt")

app.use(expressJwt({secret:secretKey})).unless({path:[/^\/api\//]}))

  意思是说变量expressJwt并不是一个中间件函数 可能我在导入express-jwt就出错了

  果然,豆包提示的第二点问题就揭示了问题所在

  2.TypeError: expressJwt is not a function 错误

  错误表明expressJwt压根就不是一个函数 一般是由于express-jwt模块的导入方式有问题

关键点来了: express-jwt 6.x 及以上版本中 导入的使用方式有所变化:

  在express-jwt 6.x以上版本 需要从express-jwt 模块中解构出expressjwt函数即 我们要将导入express-jwt模块的代码从先前的:

const expressJwt = require("express-jwt")

  改为以下代码(解构导入):

const {expressJwt} = require("express-jwt")

  这样才能真正导入express-jwt模块中的expressJwt中间件函数来解析token字符串

  当我修改完成后,欣喜地发现代码没报错,能够启动服务器了,但是当我模拟后端接口发送post请求来测试express-jwt模块将token字符串解析为用户信息对象时发现了新问题,以下是我模拟获取解析token字符串完毕后的token字符串所表示的用户信息对象的接口:

  app.get("/admin/getinfo",function(req,res){
     console.log(req.user)
     res.send({
     status: 200,
     message:"用户信息解析成功!"
     data: req.user //反馈给客户端的经过express-jwt解析后的用户信息对象
})
})

  发现控制台输出undefined,说明req.user压根不存在。

  询问豆包后发现还是express-jwt的版本问题:

在express-jwt 6.x以及以上的版本中 解析后的用户信息默认存储在req.auth而不是req.user里面

只需要将获取用户信息对象的req.user的地方改为req.auth即可 

最后发现如上图 成功获取到了解析后的用户信息对象

  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值