摘要:
我正在为基于sails.js的网站管理面板。我已经配置了websockets在我的本地主机上工作。但是当我部署到openshift时,只有io.socket.on('connect',...);正在开火。但是当我发布添加记录时,客户端什么也没收到。
细节:
首先,关于我的配置的一些细节:
Sails.js版本:0.12.3
Node.js版本:v0.10.36(已更改为与openshift版本v0.10.35相匹配的版本)
套接字客户端:sails.io.js
尝试使用内存套接字存储和Redis套接字存储,并且行为相同
当前行为:
我正在尝试为我的应用程序启用通知系统,因此我正在使用默认的sails.io.js在客户端代码中连接websocket(使用默认的io.socket对象),目前我正在使用console.log()记录任何事件。客户端js文件中的代码如下所示:
$(document).ready(function () {
io.sails.environment = "development";
if(window.location.hostname === "localhost") {
io.sails.url = 'http://localhost:1337';
} else {
io.sails.url = 'http://myapp-username.rhcloud.com:8000';
}
var adminSocket = io.socket;
// Access socket's connect event to initialize functions
adminSocket.on('connect', function () {
console.log("Connected to socket");
// Subscribe to admin model of current user
adminSocket.get('/admin/subscribeToModel');
});
// Access notification (adminAlerts) model's socket events
adminSocket.on('admin', function(event) {
console.log(event);
});
// Log Errors
adminSocket.on('error', function (event) {
console.log(event);
});
});
如您所见,套接字连接后,代码将运行io.socket.get(...)。这对localhost和openshift均适用,并记录“已连接到套接字”以及sails.io.js的默认连接消息。当服务器关闭时,客户端尝试作为默认行为重新连接。
io.socket.get在管理控制器中运行自定义控制器功能:
subscribeToModel: function(req, res, next) {
if (!req.isSocket) {
console.log("Not Socket");
return res.badRequest();
}
console.log("Socket");
Admin.subscribe(req, [req.session.userid]); //Subscribes to Admin model's entry with the user's id
return res.json({message: "Subscribed"});
}
这会在openshift和localhost中都记录“套接字”,但返回消息不可用。我不知道订阅是否在openshift中起作用,但是可以肯定在localhost中起作用。
这是设置。现在,我构建了一个函数来测试套接字行为。在管理控制器中,我创建了:
createAndBroadcastNotification: function (req, res, next) {
AdminAlerts.create({
admin: req.session.admin.id,
alertHeader: 'Some Header',
alertBody: 'Some Message',
alertType: 'label-info',
url: '/somepage'
}).exec(function (err, alert) {
if (err) {
res.serverError(err);
}
Admin.findOne({ where: {id: req.session.admin.id} }).populate('alerts').exec(function (err, admin) {
if (err) {
res.serverError(err);
}
Admin.publishAdd(req.session.userid, 'alerts', alert.id);
return res.json({message: "Done"});
});
});
}
此后,openshift和localhost都在浏览器中显示{message:Done},并且正在创建记录并将其关联到mySQL数据库中。但是,只有Localhost才按预期在控制台中发布此消息:
Object {id: 1, verb: "addedTo", attribute: "alerts", addedId: 10}
Openshift没有显示这样的消息。它也不显示任何错误消息。
我已经尝试解决了5天的问题。我还无法找到有关为什么发生这种情况的线索。
目的:
我希望在客户端中获得console.log()消息以表示正在添加警报。
最佳答案
我想到了。对于面临相同或相似问题的任何人,openshift的文档(在博客中)已过时。让sails.io.js找出主机和端口的工作“就好了”。但是,它会在firefox中返回连接错误。更改如下:
// client-side-code.js
$(document).ready(function () {
// io.sails.environment = "development";
// if(window.location.hostname === "localhost") {
// io.sails.url = 'http://localhost:1337';
// } else {
// io.sails.url = 'http://myapp-username.rhcloud.com:8000';
// }
var adminSocket = io.socket;
// Access socket's connect event to initialize functions
adminSocket.on('connect', function () {
console.log("Connected to socket");
// Subscribe to admin model of current user
adminSocket.get('/admin/subscribeToModel');
});
// Access notification (adminAlerts) model's socket events
adminSocket.on('admin', function(event) {
console.log(event);
});
// Log Errors
adminSocket.on('error', function (event) {
console.log(event);
});
});
关于javascript - Sails.js websockets在本地主机上工作,但在部署到Openshift后无法工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38646734/