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'

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

4

2 回答 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'));
于 2013-03-10T01:38:03.303 回答
1

问题是你需要使用express.static(),而不是app.static()。在您的示例中,应用程序是由

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

但是,您将其缩短为

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

因为您这样做了,所以除了再次使用之外,您没有对基本 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 时,您都必须这样做。请注意,我没有尝试过此选项,但我假设它会起作用。

我肯定会推荐选项一。此外,您可能应该在为应用程序进行配置等之后创建服务器。

于 2013-03-10T01:38:34.897 回答