Sails.js中间件无法访问数据模型:出现Unexpected token错误
解决Sails.js自定义中间件中无法访问User模型及Unexpected token错误的问题
嘿,我刚看到你的问题啦!作为Sails.js新手碰到这个问题很正常,咱们一步步来拆解解决~
核心问题分析
你遇到的Unexpected token错误,最直接的原因是你在非async函数里使用了await关键字——await只能在标记为async的函数内部使用,这是JavaScript的语法规则。另外,还要确保正确引用Sails.js的User模型,避免找不到模型的问题。
分步修复方案
1. 给中间件处理函数添加async标记
把你的authHandler函数改成async函数,这样才能合法使用await。
2. 确保正确引用User模型
在Sails.js中,默认情况下模型会挂载到全局,但如果你的项目配置禁用了全局模型,或者想更规范地引用,可以用sails.models.user来访问User模型(注意模型名是小写的,Sails会自动转换命名)。
3. 完善错误处理
把await User.findOne(...)也放到try/catch块里,避免查询数据库时的错误没有被捕获。
修改后的完整代码示例
isAuthenticated: (function(){ return async function authHandler(req, res, next) { // 这里添加async标记 let payload; try { payload = decode(req); let expTime = moment.tz(payload.exp, 'GMT').toDate(); let currentTime = moment.tz('GMT').toDate(); // 修正你之前的拼写错误currentTIme if (currentTime > expTime) { return res.status(401).json({message: 'JWT token expired.'}); } else { // 用sails.models.user确保正确引用模型,全局启用的话也可以直接用User const user = await sails.models.user.findOne({id: payload.id}); if (!user) { return res.status(401).json({message: 'Invalid token: User not found.'}); } // 将用户信息挂载到req上,后续路由可直接调用 req.user = user; next(); } } catch (err) { // 捕获JWT解码、数据库查询等环节的错误 return res.status(401).json({message: 'Authentication failed.', error: err.message}); } } })(),
额外注意点
- 检查你的
decode函数是否正确解析JWT,确保payload.id是有效的用户ID; - 确认模型文件路径:如果模型文件是
api/models/User.js,那么sails.models.user(小写)是正确的引用方式; - 注意你之前代码里的
currentTIme拼写错误,改成currentTime避免逻辑出错。
内容的提问来源于stack exchange,提问作者relentless-coder
相关产品推荐
相关产品推荐

