如何从ExpressJs路由调用SailsJs控制器函数?集成报错求助
在同一项目集成Express与Sails(单端口)的可行性及错误解决
可行,但你的代码存在两个核心问题,导致了报错:
错误原因拆解
控制器方法调用方式错误
你写的router.get('/users',UserController.find(req,res))会立即执行UserController.find方法,而不是把它作为路由处理函数传给Express。Express路由需要接收一个回调函数((req,res)=>{...}),正确的写法是直接传递方法引用,让Express自动注入req和res参数。模型引用错误
报错“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
相关产品推荐
相关产品推荐

