2013-03-10 63 views
3
var app = require('express')() 
    , server = require('http').createServer(app) 
    , io = require('socket.io').listen(server); 

server.use(app.static('public')); 
server.listen(3000); 


app.get('/', function (req, res) { 
    res.sendfile('index.html'); 
}); 

io.sockets.on('connection', function (socket) { 
    socket.emit('news', { hello: 'world' }); 
    socket.on('my other event', function (data) { 
    console.log(data); 
    }); 
}); 

我只是試圖啓動一個非常小的工作項目,但當它涉及到靜態內容時就卡住了。我查了其他類似的線程,但我無法找出爲什麼它不會爲我工作。我只是得到這個錯誤:帶nodejs和express的靜態文件夾

server.use(app.static('public')); 
        ^
TypeError: Object function app(req, res){ app.handle(req, res); } has no method 'static' 

我想我做錯了什麼,但我真的不能想出什麼。也許我應該早點去睡覺吧:)

回答

6

從表達式3開始的API是您需要將普通表達式模塊與您的應用程序實例分開。

var express = require('express'); //do NOT invoke the function here 
var app = express(); //DO invoke it here to get app 
app.use(express.static(__dirname + '/public')); 
1

的問題是,你需要使用express.static(),不app.static()。在您的例子中,應用程序是有效地

var express = require('express'); 
var app = express(); 

創建但是你縮短它

var app = require('express')(); 

因爲你這樣做,你根本就沒有再次使用require('express')到基礎明示對象以外的任何引用,這是你需要使用靜態的參考。

您可以修復這兩種方法。

1)改變你的開始代碼

var express = require('express') 
    , app = express() 
    , server = require('http').createServer(app) 
    , io = require('socket.io').listen(server); 

和你的配置,以

app.use(express.static(path.join(__dirname, 'public'))); 

2)簡單的配置更改爲

app.use(require('express').static(path.join(__dirname, 'public'))); 

但是你必須做這隻要你引用Express。請注意,我沒有嘗試過這個選項,但我假設它會起作用。

我肯定會推薦選項一。另外,您應該在爲應用程序執行配置等操作後創建服務器。