使用npm安装socket.io时遇到如下错误:
npm ERR! Error: Invalid protocol npm ERR! at Request.init (/opt/nodejs/lib/node_modules/npm/node_modules/request/main.js:308:31) npm ERR! at new Request (/opt/nodejs/lib/node_modules/npm/node_modules/request/main.js:103:8) npm ERR! at request (/opt/nodejs/lib/node_modules/npm/node_modules/request/main.js:962:11) npm ERR! at RegClient.makeRequest (/opt/nodejs/lib/node_modules/npm/node_modules/npm-registry-client/lib/request.js:199:13) npm ERR! at RegClient.<anonymous> (/opt/nodejs/lib/node_modules/npm/node_modules/npm-registry-client/lib/request.js:116:17) npm ERR! at RetryOperation.attempt (/opt/nodejs/lib/node_modules/npm/node_modules/retry/lib/retry_operation.js:56:8) npm ERR! at RegClient.regRequest [as request] (/opt/nodejs/lib/node_modules/npm/node_modules/npm-registry-client/lib/request.js:113:13) npm ERR! at RegClient.get_ (/opt/nodejs/lib/node_modules/npm/node_modules/npm-registry-client/lib/get.js:112:8) npm ERR! at RegClient.<anonymous> (/opt/nodejs/lib/node_modules/npm/node_modules/npm-registry-client/lib/get.js:37:12) npm ERR! at fs.readFile (fs.js:176:14) npm ERR! If you need help, you may report this log at: npm ERR! <http://github.com/isaacs/npm/issues> npm ERR! or email it to: npm ERR! <npm-@googlegroups.com>
根据错误提示查看/opt/nodejs/lib/node_modules/npm/node_modules/request/main.js中相关代码:
var protocol = self.proxy && !self.tunnel ? self.proxy.protocol : self.uri.protocol , defaultModules = {'http:':http, 'https:':https} , httpModules = self.httpModules || {} ; self.httpModule = httpModules[protocol] || defaultModules[protocol] console.log(protocol); console.log(self.proxy); console.log(self.tunnel); console.log(self.proxy.protocol); console.log(self.uri.protocol); if (!self.httpModule) throw new Error("Invalid protocol")
其中的console.log为新加入,用于查看到底是哪个参数导致invalid protocol。
结果发现self.proxy解析到错误的值(由于当前server无法访问互联网,在环境中需要设置http_proxy)。
{ protocol: '192.168.1.50:', host: '8010', hostname: '8010', href: '192.168.1.50:8010' }
想到,我在设置http_proxy没有带上协议。后来把http_proxy设置成http://192.168.1.50:8010,不再报错。
Over.
PS:经同事提示,我一直跟大家说http_proxy的设置时,基本都是带有http头的。这次真是自己坑了自己。