2013-05-09 124 views
0

你可以看看下面的代码,让我知道我在做什么错吗?在Ubuntu 12.4上运行Node.js + Express + Socket.io我想创建一个简单的Push函数。服务器工作正常,但我不能在页面上看到div id“status”内容,显然该功能没有运行!Node.js和Socket.io不能在这个例子中工作

感谢您的帮助和提前发表评论,并对很长的帖子感到抱歉!

这里是app.js文件 /** * 模块的依赖关系。 */

var express = require('express') 
, routes = require('./routes') 
, user = require('./routes/user') 
, http = require('http') 
, path = require('path'); 

var app = express(); 

// all environments 
app.set('port', process.env.PORT || 3000); 
app.set('views', __dirname + '/views'); 
app.set('view engine', 'jade'); 
app.use(express.favicon()); 
app.use(express.logger('dev')); 
app.use(express.bodyParser()); 
app.use(express.methodOverride()); 
app.use(app.router); 
app.use(express.static(path.join(__dirname, 'public'))); 

// development only 
if ('development' == app.get('env')) { 
    app.use(express.errorHandler()); 
    } 

    app.get('/', routes.index); 
    app.get('/users', user.list); 

    var status = "I am not changed yet!."; 

    io.sockets.on('connection', function (socket) { 
    io.sockets.emit('status', { status: status }); 
    socket.on('reset', function (data) { 
    status = "You Change the text!"; 
    io.sockets.emit('status', { status: status }); 
    }); 


http.createServer(app).listen(app.get('port'), function(){ 
console.log('Express server listening on port ' + app.get('port')); 
}); 

我修改了 “的package.json”,如下,加入sockt.io到依赖性

{ 
    "name": "application-name", 
    "version": "0.0.1", 
    "private": true, 
    "scripts": { 
    "start": "node app.js" 
    }, 
"dependencies": { 
"express": "3.2.3", 
"jade": "*", 
"socket.io:0.9.14" 
    } 
} 

视图文件夹和index.jade我有

<div id="status"></div> 
<button id="reset">Reset!</button> 

layout.jade我所拥有的是:

<!DOCTYPE html> 
<html lang="en"> 
<head> 
<meta charset="utf-8"> 
<title>Title</title> 
<meta name="description" content=""> 
<meta name="author" content=""> 

<!-- HTML5 shim, for IE6-8 support of HTML elements --> 
<!--[if lt IE 9]> 
    <script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script> 
<![endif]--> 

<!-- styles --> 
<link href="/css/main.css" rel="stylesheet"> 

</head> 
<body> 
<%- body %> 
<script src="node_modules/socket.io/socket.io.js"></script> 
<script src="public/js/libs/jquery.js"></script> 
<script src="public/js/main.js"></script> 
</body> 

和最后这里面我有main.js功能:

var socket = io.connect(window.location.hostname); 
socket.on('status', function (data) { 
$('#status').html(data.status); 
}); 

$('#reset').click(function() { 
socket.emit('reset'); 
}); 

错误信息由罗伯特提示编辑后

SyntaxError: Unexpected end of input 
at Module._compile (module.js:439:25) 
at Object.Module._extensions..js (module.js:474:10) 
at Module.load (module.js:356:32) 
at Function.Module._load (module.js:312:12) 
at Function.Module.runMain (module.js:497:10) 
at startup (node.js:119:16) 
at node.js:901:3 
+1

看看浏览器控制台,这个脚本是否成功加载:node_modules/socket.io/socket.io.js?从socket.io文件,这应该工作: ltebean 2013-05-09 03:02:41

回答

2

您好,重新缺少一些基本知识:你没有加载socket.io模块(我假设你已经安装了它,否则首先使用npm install socket.io),你没有连接到HTTP服务器,并且你不包括客户端您的模板正确(正如@ltebean已经指出的那样)。

服务器端第一:

// app.js 
var express = require('express') 
, routes = require('./routes') 
, user = require('./routes/user') 
, http = require('http') 
, path = require('path'); 

var app  = express() 
, server = http.createServer(app)    // create HTTP server 
, io  = require('socket.io').listen(server); // load socket.io and connect  
                // it to the HTTP server 
... 

// start listening 
server.listen(app.get('port')); 

下一个客户端:

// layout.jade 
... 
<script src="/socket.io/socket.io.js"></script> 
... 

在你main.js,我会建议使用io.connect自动发现:

var socket = io.connect(); // no argument means auto-discovery 

而且,你package.json无效:

"socket.io:0.9.14"  // not a valid object property! 
"socket.io" : "0.9.14" // should be this 
+1

此外,在html文件中,他需要创建一个'

'元素,以便他的客户端代码可以访问/更新它。 – 2013-05-09 14:14:00

+0

嗨罗伯特感谢您的评论,但编辑文件后,你说我现在得到这个错误。请看看我刚编辑的第一篇文章的结尾 – 2013-05-09 15:59:28

+0

@BehrouzHosseiniK。我只注意到:你的模板看起来像[ejs](https://github.com/visionmedia/ejs),它与[jade](http://jade-lang.com/)完全不同,模板引擎已配置。您需要将模板转换为Jade,或者使用EJS引擎(由于EJS不支持布局,您需要[ejs-locals](https://github.com/RandomEtc/ejs-locals)作为好)。 – robertklep 2013-05-09 16:08:56