无法从 Socket.io 获得响应
Not able to get the response from Socket.io
我正在尝试创建一个简单的聊天应用程序,我正在尝试收听私人频道,但我无法收听。不知道哪里出错了我的代码如下。
文件:Chat.vue
export default {
props: {
user: {
type: Object,
required: true
}
},
data() {
return {
selectedContact: null,
messages: [],
contacts: []
};
},
mounted() {
window.Echo.private(`chats.${this.user.id}`)
.listen('NewChatMessage', (e) => {
console.log('heared');
// this.handleIncoming(e.message);
});
console.log('mounted');
axios.get('/chat/contacts')
.then((response) => {
this.contacts = response.data;
});
},
methods: {
startConversationWith(contact) {
axios.get(`/chat/conversation/${contact.id}`)
.then((response) => {
this.messages = response.data;
this.selectedContact = contact;
});
},
saveNewMessage(text) {
this.messages.push(text);
},
handleIncoming(message) {
if(this.selectedContact && this.selectedContact.id == message.from) {
this.saveNewMessage(message);
}
}
},
components: {Conversation, ContactsList}
}
文件名:routes/channels.php
Broadcast::channel('chats.{id}', function ($user, $id) {
return (int) $user->id === (int) $id;
});
文件名:app/Events/NewChatMessage.php
class NewChatMessage implements ShouldBroadcast
{
use Dispatchable, InteractsWithSockets, SerializesModels;
public $chat;
public $broadcastQueue = 'chat';
/**
* Create a new event instance.
*
* @return void
*/
public function __construct(Chat $chat)
{
$this->chat = $chat;
}
/**
* Get the channels the event should broadcast on.
*
* @return \Illuminate\Broadcasting\Channel|array
*/
public function broadcastOn()
{
return new PrivateChannel('chats.' . $this->chat->to);
}
public function broadcastWith()
{
return ["message" => $this->chat];
}
}
保存时我调用了这样的事件broadcast(new NewChatMessage($chat));
我的Stack如下,
OS: Windows 10
服务器:Apache2
数据库:MySql
缓存:Redis
我发现 Laravel 在 Redis 的 config/database.php 文件中有一个前缀选项配置。我在 Redis 的选项中评论了前缀。然后它开始工作了。
'redis' => [
'client' => env('REDIS_CLIENT', 'phpredis'),
'options' => [
'cluster' => env('REDIS_CLUSTER', 'redis'),
// 'prefix' => env('REDIS_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_') . '_database_'),
],
'default' => [
'url' => env('REDIS_URL'),
'host' => env('REDIS_HOST', '127.0.0.1'),
'password' => env('REDIS_PASSWORD', null),
'port' => env('REDIS_PORT', '6379'),
'database' => env('REDIS_DB', '0'),
],
'cache' => [
'url' => env('REDIS_URL'),
'host' => env('REDIS_HOST', '127.0.0.1'),
'password' => env('REDIS_PASSWORD', null),
'port' => env('REDIS_PORT', '6379'),
'database' => env('REDIS_CACHE_DB', '1'),
],
],
这可能对以后的某个人有所帮助。
我正在尝试创建一个简单的聊天应用程序,我正在尝试收听私人频道,但我无法收听。不知道哪里出错了我的代码如下。
文件:Chat.vue
export default {
props: {
user: {
type: Object,
required: true
}
},
data() {
return {
selectedContact: null,
messages: [],
contacts: []
};
},
mounted() {
window.Echo.private(`chats.${this.user.id}`)
.listen('NewChatMessage', (e) => {
console.log('heared');
// this.handleIncoming(e.message);
});
console.log('mounted');
axios.get('/chat/contacts')
.then((response) => {
this.contacts = response.data;
});
},
methods: {
startConversationWith(contact) {
axios.get(`/chat/conversation/${contact.id}`)
.then((response) => {
this.messages = response.data;
this.selectedContact = contact;
});
},
saveNewMessage(text) {
this.messages.push(text);
},
handleIncoming(message) {
if(this.selectedContact && this.selectedContact.id == message.from) {
this.saveNewMessage(message);
}
}
},
components: {Conversation, ContactsList}
}
文件名:routes/channels.php
Broadcast::channel('chats.{id}', function ($user, $id) {
return (int) $user->id === (int) $id;
});
文件名:app/Events/NewChatMessage.php
class NewChatMessage implements ShouldBroadcast
{
use Dispatchable, InteractsWithSockets, SerializesModels;
public $chat;
public $broadcastQueue = 'chat';
/**
* Create a new event instance.
*
* @return void
*/
public function __construct(Chat $chat)
{
$this->chat = $chat;
}
/**
* Get the channels the event should broadcast on.
*
* @return \Illuminate\Broadcasting\Channel|array
*/
public function broadcastOn()
{
return new PrivateChannel('chats.' . $this->chat->to);
}
public function broadcastWith()
{
return ["message" => $this->chat];
}
}
保存时我调用了这样的事件broadcast(new NewChatMessage($chat));
我的Stack如下,
OS: Windows 10
服务器:Apache2
数据库:MySql
缓存:Redis
我发现 Laravel 在 Redis 的 config/database.php 文件中有一个前缀选项配置。我在 Redis 的选项中评论了前缀。然后它开始工作了。
'redis' => [
'client' => env('REDIS_CLIENT', 'phpredis'),
'options' => [
'cluster' => env('REDIS_CLUSTER', 'redis'),
// 'prefix' => env('REDIS_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_') . '_database_'),
],
'default' => [
'url' => env('REDIS_URL'),
'host' => env('REDIS_HOST', '127.0.0.1'),
'password' => env('REDIS_PASSWORD', null),
'port' => env('REDIS_PORT', '6379'),
'database' => env('REDIS_DB', '0'),
],
'cache' => [
'url' => env('REDIS_URL'),
'host' => env('REDIS_HOST', '127.0.0.1'),
'password' => env('REDIS_PASSWORD', null),
'port' => env('REDIS_PORT', '6379'),
'database' => env('REDIS_CACHE_DB', '1'),
],
],
这可能对以后的某个人有所帮助。