我对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);
})
});
});
答案 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.x
和express
示例的2.x
socket.io
更改。这就是为什么 robertklep 提出的解决方案必须让socket.io
使用最新版本的express
服务器。