对于一个看起来微不足道的东西,我感到非常沮丧。
我正在用ES6编写并使用webpack编译的node.js服务器上运行一个快速应用程序。除非出现以下警告,否则编译没有任何错误:
../node_modules/socket.io/lib/index.js 113:11-32
0:0 warning Critical dependency: the request of a dependency is an expression
(尽管我不确定这是否与我当前的问题有关)
但是,当我启动服务器时,出现以下错误:
Error: Cannot find module 'socket.io-client/dist/socket.io.js'
at Function.webpackEmptyContext [as resolve] (webpack:///../node_modules/socket.io/lib_sync?:2:10)
at resolvePath (webpack:///../node_modules/socket.io/lib/index.js?:113:100)
at Server.serveClient (webpack:///../node_modules/socket.io/lib/index.js?:116:25)
at new Server (webpack:///../node_modules/socket.io/lib/index.js?:53:8)
at Function.Server [as listen] (webpack:///../node_modules/socket.io/lib/index.js?:44:41)
at new Socket (webpack:///./server/socket.js?:10:98)
套接字类:
import io from 'socket.io';
export default class Socket {
constructor(server) {
this.io = io.listen(server);
this.io.on('connection', (socket) => {
// Handle connection
});
}
}
服务器参数是从express.listen()
函数返回的对象。
我使用命令npm install socket.io --save
安装了socket.io,随后在我的package.json中添加了依赖项"socket.io": "^2.1.1"
,并运行命令npm install
更新了我的依赖项,但仍然遇到错误
您可以说,对此我感到很困惑……尤其是在几乎完全遵循here文档之后,我们将不胜感激任何帮助!
答案 0 :(得分:3)
这对我来说是成功的秘诀:
var io = require('socket.io')(server, { serveClient: false })
答案 1 :(得分:0)
软件包socket.io
取决于socket.io-client
(因此应该可用)。而documentation可能已经解释了这个问题(很难说,因为没有相关的代码)。
从3.0开始,快速应用程序已成为您传递给
http
或http Server
实例的请求处理程序功能。您需要将Server
传递给socket.io
,而不是快速应用程序函数。另外,请确保在.listen
而非server
上致电app
。
var app = require('express')();
var server = require('http').createServer(app);
var io = require('socket.io')(server);
io.on('connection', function(){ /* … */ });
server.listen(3000);
答案 2 :(得分:0)
我终于解决了这个问题。我正在使用nodejs和webpack构建在Linux中运行的服务器。使用socket.io作为websocket组件。我收到此错误,然后查看源代码:node_modules / socket.io / lib / index.js
Server.prototype.serveClient = function(v){
if (!arguments.length) return this._serveClient;
this._serveClient = v;
var resolvePath = function(file){
var filepath = path.resolve(__dirname, './../../', file);
if (exists(filepath)) {
return filepath;
}
return require.resolve(file);
};
if (v && !clientSource) {
clientSource = read(resolvePath( 'socket.io-client/dist/socket.io.js'), 'utf-8');
try {
clientSourceMap = read(resolvePath( 'socket.io-client/dist/socket.io.js.map'), 'utf-8');
} catch(err) {
debug('could not load sourcemap file');
}
}
return this;
};
因此,我将代码更新为禁止客户端: var io = require('socket.io')(http,{serveClient:false});
如果您想使用serveClient功能,则可以更新代码:
Server.prototype.serveClient = function(v){
if (!arguments.length) return this._serveClient;
this._serveClient = v;
var resolvePath = function(file){
var filepath = path.resolve(process.cwd(), './', file);
if (exists(filepath)) {
return filepath;
}
return require.resolve(file);
};
if (v && !clientSource) {
clientSource = read(resolvePath( 'socket.io-client/dist/socket.io.js'), 'utf-8');
try {
clientSourceMap = read(resolvePath( 'socket.io-client/dist/socket.io.js.map'), 'utf-8');
} catch(err) {
debug('could not load sourcemap file');
}
}
return this;
};
然后将socket.io-client文件夹从node_modules复制到您的Webpack构建路径。 当在第3部分库中使用path.resolve而不是require()加载资源时,请注意这是webpack的常见问题。始终,应逐案处理类似的问题。
答案 3 :(得分:0)
Webpack's official answer是要添加{ serveClient: false }
,就像人们在这里回答一样:
var io = require('socket.io')(server, { serveClient: false })