带有nodejs和express的静态文件夹

时间:2013-03-10 01:28:51

标签: node.js

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

我只是试图启动非常小的工作项目,但是当涉及到静态内容时我就陷入了困境。我检查了其他类似的线程,但我不知道为什么它不适合我。我刚收到这个错误:

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

我想我做错了什么,但我真的不知道是什么。也许我应该尽快上床睡觉:)。

2 个答案:

答案 0 :(得分: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 :(得分: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,都必须这样做。请注意,我没有尝试过这个选项,但我认为它会起作用。

我肯定会推荐第一选项。此外,您应该在完成配置后为应用程序创建服务器。