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
回答如下:更多推荐
redis、socket.io
发布评论