nodejs连接laravel>laravel"/>
如何从nodejs连接laravel>laravel
第一个方法:从
node侧使用
laravel Echo
我正在尝试使用 nodejs 中的
laravel-Echo
包连接 socketio 服务器
如下:
const express = require("express");
const path = require("path");
const app = express();
const ioClient = require("socket.io-client");
// const socketio = require("socket.io");
const Echo = require("laravel-echo");
this.echo = new Echo({
broadcaster: 'socket.io',
host: 'localhost' + ':' + 6001,
client: ioClient,
logToConsole: true,
transports: ['websocket', 'polling', 'flashsocket'],
});
console.log(echo);
this.echo.channel('close-flare').listen('.CloseFlareEvent', data => {
console.log(data);
});
app.use(express.static(path.join(__dirname, "..", "public")));
module.exports = app;
当我
console.log(this.echo)
node 控制台内的对象返回如下:
Echo {
options: {
broadcaster: 'socket.io',
host: 'localhost:6001',
client: <ref *1> [Function: lookup] {
managers: [Object],
io: [Circular *1],
protocol: [Getter],
connect: [Circular *1],
Manager: [Getter]
},
logToConsole: true,
transports: [ 'websocket', 'polling', 'flashsocket' ]
},
connector: SocketIoConnector {
_defaultOptions: {
auth: [Object],
authEndpoint: '/broadcasting/auth',
broadcaster: 'socket.io',
csrfToken: null,
host: 'localhost:6001',
key: null,
namespace: 'App.Events',
client: [Function],
logToConsole: true,
transports: [Array],
path: '/socket.io',
hostname: 'undefined',
secure: false,
port: '80'
},
options: {
auth: [Object],
authEndpoint: '/broadcasting/auth',
broadcaster: 'socket.io',
csrfToken: null,
host: 'localhost:6001',
key: null,
namespace: 'App.Events',
client: [Function],
logToConsole: true,
transports: [Array],
path: '/socket.io',
hostname: 'undefined',
secure: false,
port: '80'
},
socket: Socket {
receiveBuffer: [],
sendBuffer: [],
ids: 0,
acks: {},
flags: {},
io: [Manager],
nsp: '//localhost:6001',
connected: false,
disconnected: true,
auth: [Object],
subs: [Array],
_callbacks: [Object]
},
channels: {}
}
}
但是问题是,当我从 laravel 发送事件时,它不会进入 node 服务器。但是,如果我从浏览器端调用它,我确实会收到事件消息,如下所示:
此代码在 浏览器端运行良好:
const Echo = require("laravel-echo");
window.Echo = new Echo({
broadcaster: "socket.io",
host: window.location.hostname + ":" + 6001,
logToConsole: true,
transports: ["websocket", "polling", "flashsocket"],
});
console.log(window.Echo);
window.Echo.channel("close-flare").listen(
".CloseFlareEvent",
(data) => {
console.log(data);
}
);
php >laravel 建立代码:
这段代码在larvel内部建立了通道和事件
<?php
namespace App\Events;
use Illuminate\Broadcasting\Channel;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Broadcasting\PresenceChannel;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
use Illuminate\Contracts\Broadcasting\ShouldBroadcastNow;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;
class CloseFlareByTrader implements ShouldBroadcastNow
{
use InteractsWithSockets, SerializesModels;
/**
* Create a new event instance.
*
* @return void
*/
public $flare_id;
public function __construct($flare_id)
{
$this->flare_id = $flare_id;
}
/**
* Get the channels the event should broadcast on.
*
* @return \Illuminate\Broadcasting\Channel|array
*/
public function broadcastOn()
{
return new Channel('close-flare');
}
/**
* The event's broadcast name.
*
* @return string
*/
public function broadcastAs()
{
return 'CloseFlareEvent';
}
/**
* The event's broadcast name.
*
* @return string
*/
public function broadcastWith()
{
return ['flare_id' => $this->flare_id];
}
}
第二个方法:尝试在
WebSocket
中使用laravel Echo
代替node
如果我尝试使用 WebSocket 连接套接字,如下所示:
const WebSocket = require("ws");
var ws = new WebSocket("http://localhost:6001/socket.io?transport=websocket");
我在节点端收到以下错误:
events.js:292
throw er; // Unhandled 'error' event
^
Error: socket hang up
at connResetException (internal/errors.js:607:14)
at Socket.socketOnEnd (_http_client.js:493:23)
at Socket.emit (events.js:327:22)
at endReadableNT (internal/streams/readable.js:1327:12)
at processTicksAndRejections (internal/process/task_queues.js:80:21)
Emitted 'error' event on WebSocket instance at:
at ClientRequest.<anonymous> (C:\Users\Ahmad\Desktop\New folder\node_modules\ws\lib\websocket.js:579:15)
at ClientRequest.emit (events.js:315:20)
at Socket.socketOnEnd (_http_client.js:493:9)
at Socket.emit (events.js:327:22)
at endReadableNT (internal/streams/readable.js:1327:12)
at processTicksAndRejections (internal/process/task_queues.js:80:21) {
code: 'ECONNRESET'
}
在 laravel-echo-server 我得到:
events.js:292
throw er; // Unhandled 'error' event
^
Error: read ECONNRESET
at TCP.onStreamRead (internal/stream_base_commons.js:209:20)
Emitted 'error' event on Socket instance at:
at emitErrorNT (internal/streams/destroy.js:106:8)
at emitErrorCloseNT (internal/streams/destroy.js:74:3)
at processTicksAndRejections (internal/process/task_queues.js:80:21) {
errno: -4077,
code: 'ECONNRESET',
syscall: 'read'
}
回答如下:
我在使用 React-Native 时遇到了类似的问题,我想连接到 Laravel-Echo 服务器。 larave-echo-server 工作正常,并在 larave 客户端发送信号,但无法在 React Native 中获取信号。 这是我的react-native larave-echo 和socket.io-client 设置
useEffect(() => {
const echo = new Echo({
broadcaster: 'socket.io',
host: `wss://${host}:6001`,
client: io,
});
const channel = echo.channel('trading-signal');
channel.listen('TradingSignalEvent', e => {
console.log('Received trading signal:', e.trading_signal);
if(e.trading_signal){
setTradingSignal(e.trading_signal)
}
});
echo.connector.socket.on('connect', () => {
console.log('Successfully connected.');
});
echo.connector.socket.on('connect_error', (error) => {
console.error('Error Message:', error.message);
});
// Cleanup function
return () => {
console.log('stopListening')
channel.stopListening('TradingSignalEvent');
echo.disconnect();
};
}, []);
在顶部导入:
import Echo from 'laravel-echo';
import io from 'socket.io-client';
我的问题是我在react-native端和后端使用了不同的socket.io包版本。当我在react-native上降级时它开始工作
"socket.io": "^2.5.0",
"socket.io-client": "^2.5.0"
您还应该检查是否正确配置了 larave-echo-server.json 文件。对于 https(wss),您需要声明 ssl 证书路径。
{
"authHost": "http://localhost",
"authEndpoint": "/broadcasting/auth",
"clients": [],
"database": "redis",
"databaseConfig": {
"redis": {},
"sqlite": {
"databasePath": "/database/laravel-echo-server.sqlite"
}
},
"devMode": false,
"host": null,
"port": "6001",
"protocol": "https",
"socketio": {},
"secureOptions": 67108864,
"sslCertPath": "/etc/letsencrypt/live/domain/fullchain.pem",
"sslKeyPath": "/etc/letsencrypt/live/domain/privkey.pem",
"sslCertChainPath": "",
"sslPassphrase": "",
"subscribers": {
"http": true,
"redis": true
},
"apiOriginAllow": {
"allowCors": false,
"allowOrigin": "",
"allowMethods": "",
"allowHeaders": ""
}
}
更多推荐
如何从nodejs连接laravel>laravel
发布评论