【问题标题】:Node.js and JadeNode.js 和 Jade
【发布时间】:2013-12-18 17:37:18
【问题描述】:

我很擅长使用 javascript,但我对 node.js 和 jam 还是很陌生。我正在尝试使用 socket.io(按照我在网上找到的教程)创建一个基本的聊天服务器,但我无法启动和运行它。

首先,我创建了一个基本的 package.json 文件,其中包括以下内容,运行时在我的工作目录中创建了 node_modules 目录。

{
    "name": "Chat",
    "version": "1.0.0",
    "description": "Real Time Chat",
    "dependencies": {
         "socket.io": "latest",
        "express": "latest",
        "jade": "latest"
    },
    "author": "@pattmorter"
}

到目前为止还不错吧?

然后我创建了server.js 文件和script.js 文件。接下来我为 UI 创建了 home.jade 文件。

doctype 5
html
    head
        title Chatter
        script(src='https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js')
        script(src='socket.io/socket.io.js')
        script(src='script.js')
    body
        //- some other formatting stuff that works correctly

当我启动服务器并转到 127.0.0.1:3000 时,页面会显示,但在错误控制台中显示 GET http://127.0.0.1:3000/socket.io/socket.io.js 404 (Not Found) 错误。

我以为我正确引用了该文件,但我猜不是 :( 我的想法是,由于 server.js 文件正在渲染 home.jade 文件,我只需要在玉文件中执行 script(src='socket.io/socket.io.js')

任何正确方向的提示将不胜感激!

编辑 1
这是我的server.jssn-p

var express = require("express");
var app = express();
var jade = require('jade');
var io = require('socket.io').listen(app);

app.set('views', __dirname + '/views');
app.set('view engine', 'jade');
app.set("view options", { layout: false });
app.configure(function() {
        app.use(express.static(__dirname + '/public'));
});
app.get('/', function(req, res){
  res.render('home.jade');
});
app.listen(3000);

io.sockets.on('connection', function (socket) {
    socket.on('setPseudo', function (data) {
        socket.set('pseudo', data);
    });
    socket.on('message', function (message) {
        socket.get('pseudo', function (error, name) {
            var data = { 'message' : message, pseudo : name };
            socket.broadcast.emit('message', data);
            console.log("user " + name + " send this : " + message);
        })
    });
});

【问题讨论】:

  • 尝试添加//socket.io/socket.io.js
  • 听起来你的server.js 没有正确初始化socket.io。可以发一些代码吗?
  • @BrianGlaz / 没有帮助。
  • @Tom 如果您正确设置了socket.io,则您不需要在express.static 提供的目录中的任何位置都有socket.io.js 文件; socket.io 模块实际上确实自己处理请求。

标签: javascript node.js express socket.io pug


【解决方案1】:

您的socket.io 初始化不正确。

而不是这个(这实际上给了我一个警告):

var io = require('socket.io').listen(app);
...
app.listen(3000);

使用这个:

var io = require('socket.io').listen(app.listen(3000));

// or a bit more elaborate:
var server = app.listen(3000);
var io     = require('socket.io').listen(server);

不同之处在于socket.io.listen() 方法将http.Server 实例作为参数,这是Express 的.listen() 方法恰好返回的。

app 本身就是一个 Express 实例,这是另外一回事。

【讨论】:

  • 做到了。你能解释一下为什么使用.listen(app.listen(3000))
【解决方案2】:

发布您的server.js sn-p,因为这是您最有可能遇到问题的地方。当浏览器请求/socket.io/socket.io.js 时,您需要仔细遵循http://socket.io 上的示例,以确保socket.io 正确响应socket.io 客户端javascript 代码。

【讨论】:

    【解决方案3】:

    除了 robertklep 回答之外,请查看 express wiki 页面中的Socket.IO compatibility 部分。

    它解释了 express 3.x 的变化中断 express 2.xsocket.io 示例。这就是为什么 robertklep 提出的解决方案必须让 socket.io 与最新版本的 express 服务器一起工作。

    【讨论】:

      猜你喜欢
      • 2012-08-07
      • 2023-04-10
      • 2011-08-16
      • 2013-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-13
      相关资源
      最近更新 更多