在使用 socket.io 時遇到一個看似很大的問題,花了兩個小時發現是一個引號引發的血案。并不是什么技術難題,但是這次解決問題的過程給我了很大的感悟。
遇到問題要先分析其原因,弄清楚其本質。不要光想著尋求幫助,例如搜索之類的手段。log 信息中其實包含了重要的線索,不要忽視。
有句話是這么說的:遇到問題不要老是認為是機器、環境的鍋,回頭看看,多半都是自己寫的程序有錯。
問題很簡單,我在根據 socket.io api 簡單引入
import io from 'socket.io-client'
只是簡單的引入,沒有任何其他的代碼。報錯:
Uncaught SyntaxError: Unexpected token :
at Object../node_modules/socket.io-client/node_modules/debug/src/browser.js (app.js:4627)
at __webpack_require__ (app.js:679)
at fn (app.js:89)
at Object.eval (url.js?5759:7)
at eval (url.js:77)
at Object../node_modules/socket.io-client/lib/url.js (app.js:4620)
at __webpack_require__ (app.js:679)
at fn (app.js:89)
at eval (index.js?0e64:6)
at Object../node_modules/socket.io-client/lib/index.js (app.js:4592)
粗略一看,語法錯誤,冒號的鍋。好,那么解決吧。怎么解決呢,看文檔噻,去搜索噻。花了大量的時間去查文檔,搜索,并沒有用?;剡^頭來自己仔細琢磨一下。
首先,語法錯誤,看看哪里報的錯呢?/node_modules/socket.io-client/node_modules/debug/src/browser.js (app.js:4627)
瀏覽器里看看源碼吧。
就是這里,不認真看,不認真想,以為是環境變量的問題。又朝著環境變量的方向一頓查,不思考,就是去搜索,去找原因??墒窃蛟谀睦铮驮诖a里面啊。
早就知道是冒號的鍋,冒號在哪里?冒號就在這里啊,http 后面的這個冒號啊。去模塊的源碼里看看,源碼是這樣子的:
// If debug isn't set in LS, and we're in Electron, try to load $DEBUG
if (!r && typeof process !== 'undefined' && 'env' in process) {
r = process.env.DEBUG;
}
再對比一下,process.env就是一個對象,需要去取 DEBUG 這個環境變量嘛。源碼里也寫的清清楚楚是 Object 的,那么在 URL_PREFIX 應該是一個字符串啊。這里一看就不對啊,沒有引號啊。
再去看 URL_PREFIX 在哪里定義的,這個其實不陌生啊,項目里 /config/prod.env.js 里
'use strict'
module.exports = {
NODE_ENV: '"production"',
URL_PREFIX: '[http://192.168.43.193:3000/'](http://192.168.43.193:3000/')
}
對比一下NODE_ENV發現問題了,應該是雙重引號啊。改一下
module.exports = {
URL_PREFIX: '"[http://192.168.43.193:3000/"'](http://192.168.43.193:3000/')
}
重新 start 一下,這不是沒毛病嘛。
總結一下,就像文章開始說的,根據log 信息,仔細想一下這個問題并不難的。難的就在自己把問題想復雜了,而且不思考。反思……