今天在学习黑马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即可
最后发现如上图 成功获取到了解析后的用户信息对象