Presence Chapter Presence Phoenix 1.4.6 Guides raises for Identifier 'socket' has already been declared

Presence Chapter Presence Phoenix 1.4.6 Guides raises for Identifier 'socket' has already been declared

我正在阅读 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

我的代码在这个repo.

如果我删除 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

你的错误是:

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" 

如果您确实需要 app.js 中导入的 socket(似乎并非如此),您可以在导入时给 socket 一个不同的名称。参见 。或者,您可以将在 app.js 中声明的套接字变量命名为其他名称:

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