Присутствие главы Presence Phoenix 1.4.6 Направляет повышение для идентификатора «сокет» уже объявлен

Я читаю Phoenix Guides 1.4.6 и нахожусь в Chapter Presence. Итак, я выполняю все шаги этой главы, и мой консольный javascript жалуется на это:

app.js:1 Uncaught Error: Module build failed: SyntaxError: /Users/romenigld/workspace/phoenix/hello/assets/js/app.js: Identifier 'socket' has already been declared (21:4)

  19 | import {Socket, Presence} from "phoenix"
  20 | 
> 21 | let socket = new Socket("/socket", {
     |     ^
  22 |   params: {user_id: window.location.search.split("=")[1]}
  23 | })
  24 | 
    at Parser.raise (:4000/Users/romenigld/workspace/phoenix/hello/assets/node_modules/@babel/parser/lib/index.js:6322)
    at ScopeHandler.checkRedeclarationInScope (:4000/Users/romenigld/workspace/phoenix/hello/assets/node_modules/@babel/parser/lib/index.js:3754)
    at ScopeHandler.declareName (:4000/Users/romenigld/workspace/phoenix/hello/assets/node_modules/@babel/parser/lib/index.js:3720)
    at Parser.checkLVal (:4000/Users/romenigld/workspace/phoenix/hello/assets/node_modules/@babel/parser/lib/index.js:8006)
    at Parser.parseVarId (:4000/Users/romenigld/workspace/phoenix/hello/assets/node_modules/@babel/parser/lib/index.js:10441)
    at Parser.parseVar (:4000/Users/romenigld/workspace/phoenix/hello/assets/node_modules/@babel/parser/lib/index.js:10412)
    at Parser.parseVarStatement (:4000/Users/romenigld/workspace/phoenix/hello/assets/node_modules/@babel/parser/lib/index.js:10234)
    at Parser.parseStatementContent (:4000/Users/romenigld/workspace/phoenix/hello/assets/node_modules/@babel/parser/lib/index.js:9830)
    at Parser.parseStatement (:4000/Users/romenigld/workspace/phoenix/hello/assets/node_modules/@babel/parser/lib/index.js:9763)
    at Parser.parseBlockOrModuleBlockBody (:4000/Users/romenigld/workspace/phoenix/hello/assets/node_modules/@babel/parser/lib/index.js:10340)
    at Parser.parseBlockBody (:4000/Users/romenigld/workspace/phoenix/hello/assets/node_modules/@babel/parser/lib/index.js:10327)
    at Parser.parseTopLevel (:4000/Users/romenigld/workspace/phoenix/hello/assets/node_modules/@babel/parser/lib/index.js:9692)
    at Parser.parse (:4000/Users/romenigld/workspace/phoenix/hello/assets/node_modules/@babel/parser/lib/index.js:11209)
    at parse (:4000/Users/romenigld/workspace/phoenix/hello/assets/node_modules/@babel/parser/lib/index.js:11245)
    at parser (:4000/Users/romenigld/workspace/phoenix/hello/assets/node_modules/@babel/core/lib/transformation/normalize-file.js:170)
    at normalizeFile (:4000/Users/romenigld/workspace/phoenix/hello/assets/node_modules/@babel/core/lib/transformation/normalize-file.js:138)
    at runSync (:4000/Users/romenigld/workspace/phoenix/hello/assets/node_modules/@babel/core/lib/transformation/index.js:44)
    at runAsync (:4000/Users/romenigld/workspace/phoenix/hello/assets/node_modules/@babel/core/lib/transformation/index.js:35)
    at process.nextTick (:4000/Users/romenigld/workspace/phoenix/hello/assets/node_modules/@babel/core/lib/transform.js:34)
    at process._tickCallback (:4000/internal/process/next_tick.js:61)
    at eval (app.js:1)
    at Object../js/app.js (app.js:81)
    at __webpack_require__ (app.js:20)
    at eval (app.js:1)
    at Object.0 (app.js:92)
    at __webpack_require__ (app.js:20)
    at app.js:69
    at app.js:72
(anonymous) @ app.js:1
./js/app.js @ app.js:81
__webpack_require__ @ app.js:20
(anonymous) @ app.js:1
0 @ app.js:92
__webpack_require__ @ app.js:20
(anonymous) @ app.js:69
(anonymous) @ app.js:72

мой код находится в этом репо.

И если я удалю let, он жалуется на новую ошибку:

ReferenceError: Can't find variable: socket
WebSocket connection to 'ws://localhost:4000/socket/websocket?token=undefined&vsn=2.0.0' failed: Unexpected response code: 500

person rld    schedule 25.05.2019    source источник
comment
Phoenix Guides 1.4.6 и я нахожусь в присутствии главы — Google ничего подобного не сообщает. Не думаете ли вы, что людям было бы легче помогать вам, если бы вы на самом деле включили ссылку на руководства, поскольку, по-видимому, вы знаете, где они находятся?   -  person 7stud    schedule 25.05.2019
comment
Я обновлю, еще раз спасибо!!   -  person rld    schedule 26.05.2019


Ответы (1)


Ваша ошибка:

Identifier 'socket' has already been declared

что означает, что вы не можете написать:

let socket = "abc"
let socket = "def"

И вы на самом деле делаете это в app.js:

//********* HERE **************
import socket from "./socket"   

import {Socket, Presence} from "phoenix"
window.Presence = Presence;

//********* AND HERE ***********
let socket = new Socket("/socket", { 
  params: {user_id: window.location.search.split("=")[1]}
})

Линия:

import socket from "./socket"   

создает переменную с именем socket, поэтому вы не можете впоследствии указать js создать другую переменную с именем socket, что вы делаете здесь:

let socket = new Socket("/socket", { 
  params: {user_id: window.location.search.split("=")[1]}
})

Я бы попробовал избавиться от следующего оператора импорта в app.js:

import socket from "./socket" 

Если вам действительно нужен импортированный socket в app.js (что, по-видимому, не так), вы можете дать socket другое имя при импорте. См. здесь. В качестве альтернативы вы можете назвать переменную сокета, которую вы объявили в app.js, как-то иначе:

let presence_socket = new Socket("/socket", { 
  params: {user_id: window.location.search.split("=")[1]}
})
person 7stud    schedule 25.05.2019
comment
Спасибо @7stud за ответ! Но я пробую этот переключатель, как вы публикуете здесь, и жалуется на другие ошибки ... Я думаю, что если я буду следовать руководствам Феникса, все будет в порядке, чтобы учиться и не ожидать таких вещей ... - person rld; 26.05.2019
comment
@rld, хорошо, тогда опубликуйте свой исправленный код внизу исходного вопроса, а также опубликуйте новую ошибку. Я думаю, что если я буду следовать проводникам Феникса, то все будет в порядке, чтобы учиться и не ожидать таких вещей -- я согласен. Тот, кто написал это руководство, сделал свою работу небрежно. - person 7stud; 27.05.2019
comment
@rld, я только что прошел учебник, и я заставил работать Presence. Поскольку в учебнике воссоздается один из файлов, room_channel.ex, элементы Присутствия не строятся поверх элементов Каналов в предыдущем руководстве. Если вы создаете новое приложение, например. mix phx.new MyHello тогда все будет работать, как указано в руководстве по Presence. Например, строка import socket from "./socket" в app.js будет закомментирована в новом приложении, а затем, если вы добавите в app.js то, что сказано в руководстве, вы не получите конфликт переменных socket. - person 7stud; 27.05.2019
comment
@rld, на самом деле было бы проще, если бы вы создали новый каталог, перешли в новый каталог, а затем использовали то же имя для своего приложения: hello. В противном случае вы сделаете ошибки с именами модулей и т. д. при вводе кода в учебнике. - person 7stud; 27.05.2019
comment
спасибо за ответ еще раз! Поставлю сегодня комп на гарантию на замену экрана, из-за проблемы со стангейтом. И когда я вернусь, я попробую лучше это решение, как вы сказали здесь. - person rld; 27.05.2019