You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:25:12