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

如何从ExpressJs路由调用SailsJs控制器函数?集成报错求助

在同一项目集成Express与Sails(单端口)的可行性及错误解决

可行,但你的代码存在两个核心问题,导致了报错:

错误原因拆解

  1. 控制器方法调用方式错误
    你写的router.get('/users',UserController.find(req,res))会立即执行UserController.find方法,而不是把它作为路由处理函数传给Express。Express路由需要接收一个回调函数((req,res)=>{...}),正确的写法是直接传递方法引用,让Express自动注入req和res参数。

  2. 模型引用错误
    报错“Users.find is not a function”大概率是因为Sails中模型名称的单复数问题:Sails默认使用单数模型名(比如User),对应复数表名。控制器中应该调用User.find()而非Users.find()。

正确实现步骤

1. 修正控制器方法

确保UserController中的find方法正确引用模型:

// api/controllers/UserController.js
module.exports = {
  find: async (req, res) => {
    try {
      // 注意是User而不是Users
      const users = await User.find();
      return res.json(users);
    } catch (err) {
      return res.status(500).send(err.message);
    }
  }
};

2. 调整Express路由写法

不要直接执行控制器方法,而是传递方法引用:

// Express路由文件
const router = require('express').Router();
const UserController = require('../api/controllers/UserController');

// 正确写法:传递方法作为回调,Express会自动注入req、res
router.get('/users', UserController.find);

3. 单端口集成的两种方案

方案一:Express作为主服务器,挂载Sails中间件

const express = require('express');
const app = express();
const sails = require('sails');

// 加载Sails,禁用自带的HTTP服务器
sails.load({
  hooks: { http: false },
  port: 3000,
}, (err) => {
  if (err) throw err;

  // 挂载Sails的核心中间件(处理模型、控制器上下文)
  app.use(sails.hooks.http.middleware);

  // 添加自定义Express路由
  app.use('/api', require('./routes/express-routes'));

  // 启动Express服务器
  app.listen(3000, () => {
    console.log('Server running on port 3000');
  });
});

方案二:Sails作为主框架,挂载Express路由

const sails = require('sails');
const express = require('express');
const expressRouter = express.Router();
const UserController = require('./api/controllers/UserController');

// 定义Express路由
expressRouter.get('/users', UserController.find);

// 启动Sails
sails.load({
  port: 3000,
}, (err) => {
  if (err) throw err;

  // 将Express路由挂载到Sails的某个路径下
  sails.hooks.http.app.use('/express', expressRouter);
});

4. 关键注意事项

  • 确保Sails初始化完成后再访问模型、控制器,否则会出现未定义的错误。
  • Sails增强了req和res对象,控制器方法依赖这些增强特性,不要在Sails上下文外直接调用控制器方法。
  • 如果使用Sails v0.12版本,模型引用方式可能略有不同(比如User.find()需要回调而非async/await),但核心逻辑一致。

内容的提问来源于stack exchange,提问作者gaurav

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 13:05:19