使用Node.js和Express创建静态文件夹

4
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个回答

6

从Express 3开始,API是需要将纯的Express模块与您的应用实例分开。

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()。在你的例子中,app实际上是由创建的。
var express = require('express');
var app = express();

然而你将其缩短为:
var app = require('express')();

因为您这样做了,除非再次使用require('express'),否则您无法引用基本的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时都必须这样做。请注意,我尚未尝试此选项,但我认为它会起作用。
我强烈建议选择第一种选项。此外,在进行应用程序的配置等操作后,您应该创建服务器。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接