Socket.io io.use 失败 - TypeError: io.use 不是一个函数。

4

我正在处理一个需要socket握手会话的项目,我想让这段代码工作起来,它来自于https://www.npmjs.com/package/express-socket.io-session

var app = require('express')(),
  server  = require("http").createServer(app),
  io = require("socket.io")(server),
  session = require("express-session")({
    secret: "my-secret",
    resave: true,
    saveUninitialized: true
  }),
  sharedsession = require("express-socket.io-session");


// Attach session
app.use(session);

// Share session with io sockets

io.use(sharedsession(session));

io.on("connection", function(socket) {

    // I've add this one...
    console.log(socket.handshake.session);

    // Accept a login event with user's data
    socket.on("login", function(userdata) {
        socket.handshake.session.userdata = userdata;
    });
    socket.on("logout", function(userdata) {
        if (socket.handshake.session.userdata) {
            delete socket.handshake.session.userdata;
        }
    });        
});

server.listen(3000);

我运行它,首先看到了这个:
var io = require("socket.io")(server);
                             ^

TypeError: require(...) is not a function
    at Object.<anonymous> (/Users/Jack/Root/Sites/Scopone/provaric/server.js:8:30)
    at Module._compile (module.js:435:26)
    at Object.Module._extensions..js (module.js:442:10)
    at Module.load (module.js:356:32)
    at Function.Module._load (module.js:313:12)
    at Function.Module.runMain (module.js:467:10)
    at startup (node.js:136:18)
    at node.js:963:3

解决方法是添加:

io = require("socket.io").listen(server);

然后我得到了这个结果。

io.use(function(socket, next) {
    ^

TypeError: io.use is not a function
    at Object.<anonymous> (/Users/Jack/Root/Sites/Scopone/provaric/server.js:15:5)
    at Module._compile (module.js:435:26)
    at Object.Module._extensions..js (module.js:442:10)
    at Module.load (module.js:356:32)
    at Function.Module._load (module.js:313:12)
    at Function.Module.runMain (module.js:467:10)
    at startup (node.js:136:18)
    at node.js:963:3

有什么想法来解决这个问题吗?

socket.io@0.9.17


1
你能升级socket.io吗?0.9.17现在已经非常老了。 - slugonamission
@slugonamission 我已经下载了最新的node.js v5.4.1和npm v3.3.12。我已经卸载了socket.io并运行了npm install socket.io:当我使用npm list socket.io检查socket版本时,仍然得到socket.io@0.9.17的结果。你有什么建议? - Giacomo Scarpino
@slugonamission 我尝试使用npm install socket.io@1.4.3进行安装,虽然安装过程顺利,但是出现了以下错误:
sudo npm install socket.io@1.4.3chat@0.0.1 /Users/Jack/Root/Sites/Scopone/provaric └─┬ socket.io@1.4.3 invalid .....npm WARN EPACKAGEJSON chat@0.0.1 license should be a valid SPDX license expression
- Giacomo Scarpino
2个回答

8

我曾在同样的情况下遇到过相同的问题。虽然你的问题已经存在一段时间了,但我会发布我的解决方法。

整个问题出在我使用了:

var io = require('socket.io');

但应该是这样的:
var io = require('socket.io')();

在没有括号的情况下,其他所有内容都可以正常工作,但是io.use显然不行。

我所做的是,而不是传递服务器:

app.io = io;

在/bin/www目录下
  app.io.attach(server);

希望对某些人有用。 更新:我使用Socket 1.5.2。

在“socket.io”: “^3.0.3”中遇到了同样的问题。使用const io = require('socket.io')();解决了它。 - KeshavDulal
我在3.0.3中遇到了这个错误,而在“npm update”之前从未遇到过这个错误。 - Chris
socket.io 版本 4.2.0 仍需要此修复才能在 Node.js 中导入。 - NetPlayer

0
我已经通过升级nmp、node.js和socket.io来解决了这个问题。但是为了做到这一点,我不得不发现我的所有依赖关系都混乱了:由于这些错误,我无法升级软件包。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接