2013-05-09 34 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