启动Express应用程序时找不到模块'socket.io-client / dist / socket.io.js'

时间:2018-08-19 03:26:06

标签: node.js ecmascript-6 socket.io

对于一个看起来微不足道的东西,我感到非常沮丧。

我正在用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文档之后,我们将不胜感激任何帮助!

4 个答案:

答案 0 :(得分:3)

这对我来说是成功的秘诀:

var io = require('socket.io')(server, { serveClient: false })

答案 1 :(得分:0)

软件包socket.io取决于socket.io-client(因此应该可用)。而documentation可能已经解释了这个问题(很难说,因为没有相关的代码)。

  

从3.0开始,快速应用程序已成为您传递给httphttp 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 })