반응형
Laravel-Echo가 Vue.js를 통해 개인 채널을 구독하지 않음
저는 Laravel(백)과 Vuejs(Vuex)와 함께 프로젝트를 개발하고 있습니다.저는 또한 Sanctum:auth를 사용하여 사용자, 라라벨 웹 소켓 및 방송용 라라벨 에코를 인증합니다.
이전에 콘솔에서 "POST 'broadcast/auth' 404를 찾을 수 없습니다."라는 오류와 함께 인증 문제를 받은 적이 있습니다.
저는 같은 프로젝트에서 Sanctum, Vue, Laravel Echo를 결합한 튜토리얼을 보고 해결할 수 있었습니다.
하지만, 지금 서비스를 테스트해보니, 저는 공공 채널은 들을 수 있지만 사설 채널은 들을 수 없다는 것을 깨달았습니다.
제가 웹소켓 대시보드에서 본 바로는, 저는 심지어 개인 채널을 구독하지도 않습니다.
내 아카이브 .vue에서:
import room from './Room'
import axios from 'axios'
import Echo from 'laravel-echo'
import Pusher from 'pusher-js'
console.log(Pusher);
...
export default {
...
data: () => ({
...
Echos:undefined
}),
mounted(){
...
this.instantiatingEcho();
},
methods:{
...
instantiatingEcho(){
axios({
method: "GET",
url: "http://127.0.0.1:8000/api/users",
headers: {
Authorization: `Bearer ${this.$store.state.user.token}`,
},
})
.then(({ data }) => {
console.log(data);
this.Echos = new Echo({
broadcaster: 'pusher',
key: process.env.VUE_APP_WEBSOCKETS_KEY,
wsHost: process.env.VUE_APP_WEBSOCKETS_SERVER,
wsPort: 6001,
forceTLS: false,
disableStats: true,
authorizer: (channel, options) => {
console.log(options);
return {
authorize: (socketId, callback) => {
axios({
method: "POST",
url: "http://127.0.0.1:8000/api/broadcasting/auth",
headers: {
Authorization: `Bearer ${this.$store.state.user.token}`,
},
data: {
socket_id: socketId,
channel_name: channel.name,
},
})
.then((response) => {
callback(false, response.data);
})
.catch((error) => {
callback(true, error);
})
},
}
}
})
})
this.enterinrom();
},
enterinrom(){
this.Echos.private('Room.2')
.listen('BroadcastRoom', (e) =>{
console.log(e)
});
},
}
}
채널php:
Broadcast::channel('Room.{id}', function ($id){
return true;
});
이벤트:
<?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\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;
use App\Broadcasting\RoomChannel;
class BroadcastRoom implements ShouldBroadcast
{
use Dispatchable, InteractsWithSockets, SerializesModels;
public $mensage;
public $id;
public function __construct($mensage, $id)
{
$this->mensage = $mensage;
$this->id = $id;
}
public function broadcastWith()
{
return ["mensage" => $this->mensage];
}
public function broadcastOn()
{
return new PrivateChannel('Room.'.$this->id);
}
}
api.vmdk:
...
Broadcast::routes(['middleware' => ['auth:sanctum']]);
Route::middleware('auth:sanctum')->get('/users', function (Request $request) {
return $request->user();
});
Route::post('/users/login', function (Request $request) {
$user = User::where('email', $request->email)->first();
if (!$user || ($request->password != $user->password)) {
return response([
'message' => ['These credentials do not match our records.']
], 404);
}
$token = $user->createToken('idiot-online-token')->plainTextToken;
$response = [
'user' => $user,
'token' => $token
];
return response($response, 201);
});
웹.vmdk:
Route::get('/enviaevento/{id}', function ($id) {
return event(new \App\Events\BroadcastRoom('Uai só...', $id));
});
app\Providers\BroadcastServiceProvider::config/app.php의 클래스에 주석이 없습니다.
누가 나를 도와줄 수 있습니까?
인증자 속성에서 응답이 올바르게 사용되었는지 확인하십시오.response.data 대신 response를 사용할 수 있습니다.저는 문서에 있는 토막글로는 제 상황이 충분하지 않다는 것을 깨닫기 위해 한동안 이 문제에 매달렸습니다.
import room from './Room'
import axios from 'axios'
import Echo from 'laravel-echo'
import Pusher from 'pusher-js'
console.log(Pusher);
...
export default {
...
data: () => ({
...
Echos:undefined
}),
mounted(){
...
this.instantiatingEcho();
},
methods:{
...
instantiatingEcho(){
axios({
method: "GET",
url: "http://127.0.0.1:8000/api/users",
headers: {
Authorization: `Bearer ${this.$store.state.user.token}`,
},
})
.then(({ data }) => {
console.log(data);
this.Echos = new Echo({
broadcaster: 'pusher',
key: process.env.VUE_APP_WEBSOCKETS_KEY,
wsHost: process.env.VUE_APP_WEBSOCKETS_SERVER,
wsPort: 6001,
forceTLS: false,
disableStats: true,
authorizer: (channel, options) => {
console.log(options);
return {
authorize: (socketId, callback) => {
axios({
method: "POST",
url: "http://127.0.0.1:8000/api/broadcasting/auth",
headers: {
Authorization: `Bearer ${this.$store.state.user.token}`,
},
data: {
socket_id: socketId,
channel_name: channel.name,
},
})
.then((response) => {
callback(false, response);
})
.catch((error) => {
callback(true, error);
})
},
}
}
})
})
this.enterinrom();
},
enterinrom(){
this.Echos.private('Room.2')
.listen('BroadcastRoom', (e) =>{
console.log(e)
});
},
}
}
언급URL : https://stackoverflow.com/questions/65025372/laravel-echo-not-subscribing-to-private-channels-through-vue-js
반응형
'programing' 카테고리의 다른 글
JUN 5: 내선 번호에 스프링 구성 요소 주입(모든 콜백 전/모든 콜백 후) (0) | 2023.06.26 |
---|---|
Angular 5에서 뷰를 렌더링하기 전에 데이터 대기 (0) | 2023.06.26 |
오류: 데이터 및 소금 인수가 필요합니다. (0) | 2023.06.26 |
Angular2 - 스타일에 [_ngcontent-mav-x] 추가 (0) | 2023.06.26 |
Mounted hook에서 내부의 로컬 값을 저장하는 방법 - Vue 3 (0) | 2023.06.26 |