如何从nodejs连接laravel>laravel

编程入门 行业动态 更新时间:2024-09-25 18:22:52

如何从<a href=https://www.elefans.com/category/jswz/34/1771440.html style=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

本文发布于:2024-06-16 02:16:26,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1771436.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:nodejs   laravel   gt

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!