Angular5集成angular2-sails连接Sails.js后无法接收实时事件求助
解决Angular5 + Sails.js实时事件接收问题
我来帮你一步步排查这个实时事件收不到的问题,大概率是Sails端的配置或者事件触发逻辑没到位,咱们一个个来看:
1. 先确认模型的实时事件发布配置
Sails默认不会自动广播模型的CRUD事件,你需要在对应的模型(比如api/models/User.js)里开启自动发布,或者手动添加广播逻辑:
方式一:开启自动发布属性
在模型文件里添加以下配置:
module.exports = { attributes: { // 你的模型字段定义 }, // 开启自动发布创建/更新/销毁事件 autoPublishCreate: true, autoPublishUpdate: true, autoPublishDestroy: true, // 可选:自定义广播的房间和事件名 afterCreate: function(newRecord, cb) { // 向名为"user"的房间广播"user:created"事件 sails.sockets.broadcast('user', 'user:created', { action: 'created', data: newRecord }); cb(); } };
方式二:手动在控制器里广播
如果不想全局开启自动发布,也可以在创建用户的控制器里手动触发广播:
// api/controllers/UserController.js create: function(req, res) { User.create(req.body).exec(function(err, newUser) { if (err) return res.badRequest(err); // 广播事件到所有连接的客户端 sails.sockets.broadcast('user', 'user:created', newUser); return res.ok(newUser); }); }
2. 修正Sails端的Socket配置误区
你提到在config/http.js里配置了ioclient和io,这其实是前端客户端的配置逻辑,Sails服务端根本不需要这么做!Sails本身已经集成了Socket.io服务,你只需要确保:
config/sockets.js里的Socket服务是正常开启的(默认就是开启的),可以添加基础配置保证连接稳定:
module.exports.sockets = { transports: ['websocket', 'polling'], // 优先用websocket allowUpgrades: true, pingInterval: 25000, pingTimeout: 60000 };
- 配置CORS允许Angular的Socket连接(如果两者端口不同,比如Angular在4200,Sails在1337),修改
config/cors.js:
module.exports.cors = { allRoutes: true, origin: 'http://localhost:4200', // 替换成你的Angular地址,或者用'*'测试 credentials: true, methods: 'GET, POST, PUT, DELETE, OPTIONS, HEAD', headers: 'content-type, authorization' };
3. 确认Angular端的监听逻辑
你之前用this.sailsService.on("user").subscribe(...)可能监听的事件名不对,要和Sails端广播的事件名对应:
比如如果Sails端广播的是user:created,Angular里要这么监听:
// 在Angular组件/service里 import { SailsService } from 'angular2-sails'; constructor(private sailsService: SailsService) { // 先确保连接成功 sailsService.connect('http://localhost:1337'); // 监听指定事件 sailsService.on('user:created').subscribe(data => { console.log('收到用户创建事件:', data); }); }
4. 测试Socket连接状态
可以在Sails的控制台和Angular的浏览器控制台分别查看:
- Sails端:启动后如果看到
Socket.io server started说明服务正常 - Angular端:在浏览器DevTools的Network -> WS标签里,看是否有
ws://localhost:1337/socket.io/的连接,状态是OPEN就说明连接成功
按照上面的步骤调整后,应该就能正常收到Sails的实时事件啦!
内容的提问来源于stack exchange,提问作者Hamashi
相关产品推荐
相关产品推荐

