Node.js和Jade

时间:2013-12-02 21:16:37

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

我对javascript非常好,但我对node.js和jade相当新。我正在尝试使用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.js代码段

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);
        })
    });
});

3 个答案:

答案 0 :(得分:6)

您的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);

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

除了 robertklep 回答之外,请查看明确维基页面中的Socket.IO compatibility部分。

它解释了{em>打破 express 3.xexpress示例的2.x socket.io更改。这就是为什么 robertklep 提出的解决方案必须让socket.io使用最新版本的express服务器。