最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

redis、socket.io

网站源码admin43浏览0评论

redis、socket.io

redis、socket.io

我想使用 Laravel 并使用 socket.io、redis、节点服务器设置实时网络应用程序。 这是我的 server.js 代码:

var app = require('express')();

app.use(function (req, res, next) {
    // Website you wish to allow to connect
    res.setHeader('Access-Control-Allow-Origin', 'http://localhost:8888');

    // Request methods you wish to allow
    res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE');

    // Request headers you wish to allow
    res.setHeader('Access-Control-Allow-Headers', 'X-Requested-With,content-type');

    // Set to true if you need the website to include cookies in the requests sent
    // to the API (e.g. in case you use sessions)
    res.setHeader('Access-Control-Allow-Credentials', true);

    // Pass to next layer of middleware
    next();
});

var server = require('http').Server(app);
var io = require('socket.io')(server, {
    cors: { origin: '*' },
});

var redis = require('redis');

server.listen(3000, () => {
    console.log('hel');
});

io.on('connection', async function (socket) {
    console.log('client connected');

    var redisClient = redis.createClient({
        legacyMode: true,
    });

    await redisClient.connect().catch(console.error);

    redisClient.subscribe('message');
    redisClient.on('message', function (channel, data) {
        console.log('message received');
        socket.emit(channel, data);
    });
    socket.on('disconnect', function () {
        redisClient.quit();
    });
});

在我的controller中,我使用Redis如下代码,这个功能有效的是当我添加一个帖子(帖子在我的母语中是'BaiDang'),Redis将发布并且我可以在浏览器中实时通知:

public function store(Request $request, BaiDang $baiDang)
    {
        try {
            $baiDang->create($request->all());
            if ($request->hasFile('files')) {
                foreach ($request->file('files') as $file) {
                    $name = time() . rand(1, 100) . Str::random(40) . '.' . $file->extension();
                    Storage::putFileAs('files', $file, $name);

                    $fileData['bai_dang_id'] = DB::table('bai_dang')->max('id');
                    $fileData['link'] = 'files/' . $name;

                    FileBaiDang::create($fileData);
                }
            }
            Redis::connection();
            Redis::publish('message', json_encode($request->all()));
            return $this->success($baiDang, 201, 'Created');
        } catch (Exception $e) {
            //catch exception
            echo 'Message: ' . $e->getMessage();
            return $this->error(400, 'Lỗi server update không thành công');
        }
    }

我有另一个名为 socket.io.js 的客户端文件:

import { io } from 'socket.io-client';

const socket_host = '127.0.0.1';
const socket_port = '3000';
const socket = io(socket_host + ':' + socket_port);

socket.on('message', (data) => {
    console.log('aaahhahaahah');
});

我在下面的 app.js 中导入这个文件:

import './socket.io';

当我通过命令“节点服务器”运行节点服务器时,当客户端连接时,出现错误:

client connected
Error: connect ECONNREFUSED ::1:6379
    at TCPConnectWrap.afterConnect [as oncomplete] (node:net:1300:16) {
  errno: -4078,
  code: 'ECONNREFUSED',
  syscall: 'connect',
  address: '::1',
  port: 6379
}

拜托,任何人都可以帮助我...

对了,我问过GPT,有很多方法可以修复,但都失败了。如果你说我检查我是否运行 redis 服务器,使用正确的配置主机和端口等......我尝试了所有这些......haizz

回答如下:

与本文相关的文章

发布评论

评论列表(0)

  1. 暂无评论