我目前正在使用实时通知构建待办事项应用程序。
CONTEXT 我使用PHP(Laravel 4)构建后端,使用AngularJS(yeoman:generator-angular)构建前端。这两个应用程序不在同一个域(backend.herokuapp.com和frontend.herokuapp.com)。客户端通过公共API与服务器通信。
我想向Angular应用程序添加实时通知,当用户创建新待办事项时,我希望在所有连接的浏览器上更新UI。
SERVER 我正在使用https://github.com/Wisembly/elephant.io作为PHP和“发射器示例”的服务器。点击我的API网址时,PHP客户端会在nodejs服务器上发出一个事件。这当前有效,但只有服务器与PHP服务器位于同一个域中。
这是Laravel应用程序的配置
+ app
+ controllers
- AlertsController.php
+ push
- server.js
AlertsController.php
class AlertsController extends ApiController
{
public function index($userId = null)
{
$client = new Client(new Version1X('http://localhost:1337'));
$client->initialize();
$client->emit('broadcast', ['foo' => 'bar']);
$client->close();
}
}
server.js
var server = require('http').createServer(),
io = require('socket.io')(server),
logger = require('winston'),
port = 1337;
// Logger config
logger.remove(logger.transports.Console);
logger.add(logger.transports.Console, {colorize : true, timestamp : true});
logger.info('SocketIO > listening on port ' + port);
io.on('connection', function (socket) {
var nb = 0;
logger.info('SocketIO > Connected socket ' + socket.id);
socket.on('broadcast', function (message) {
++nb;
console.log("broadcast !");
logger.info('ElephantIO broadcast > ' + JSON.stringify(message));
io.emit('alert.created', JSON.stringify(message));
});
socket.on('disconnect', function () {
logger.info('SocketIO : Received ' + nb + ' messages');
logger.info('SocketIO > Disconnected socket ' + socket.id);
});
});
server.listen(port);
我按npm start
启动我的server.js文件。
我正在使用Homestead for Laravel。
客户端 我的客户端在另一个应用程序上,所以我在我的凉亭文件中导入https://github.com/automattic/socket.io-client并包含在项目中。此文件已正确导入(Chrome开发工具的网络面板中200 OK)。 问题是当我设置我的io连接时,我在控制台面板中有“GET http://127.0.0.1:1337/socket.io/?EIO=3&transport=polling&t=1426617086753-0 net :: ERR_CONNECTION_REFUSED”。
我正在使用Grunt创建一个网络服务器。
这是我在客户端文件中所做的:
var socket = io.connect("http://127.0.0.1:1337");
socket.on('alert.created', function (msg) {
console.log("new alert created", msg);
});
有人知道问题可能来自哪里吗?这很奇怪,我可以在PHP和NodeJS之间建立连接,但不能在我的NodeJS服务器和我的JavaScript客户端之间建立连接。
答案 0 :(得分:0)
好的,我找到了解决问题的方法。
我从Homestead移除了nodejs服务器并在外面启动它。 然后在我的Laravel应用程序中,我将127.0.0.1更改为我的IP地址。
现在一切正常。
谢谢你们!
答案 1 :(得分:0)
我遇到了同样的问题。这是因为您正在使用虚拟机,您需要明确端口转发。
在.homestead/
编辑Homestead.yaml
中,如下所示:
ports:
- send: 1337
to: 1337
protocol: tcp
重新启动您的VM,它应该按预期工作。