使用express.js的静态文件

时间:2012-05-03 14:58:12

标签: node.js express

我想将index.html/media子目录作为静态文件提供。索引文件应该在/index.html/网址上提供。

我有

web_server.use("/media", express.static(__dirname + '/media'));
web_server.use("/", express.static(__dirname));

但第二行显然是为整个__dirname服务,包括其中的所有文件(不只是index.htmlmedia),我不想要这些文件。

我也试过

web_server.use("/", express.static(__dirname + '/index.html'));

但访问基本网址/会导致向web_server/index.html/index.html(双index.html组件)发出请求,这当然会失败。

有什么想法吗?


顺便说一下,我在Express中找不到关于这个主题的文档(static() +它的参数)...令人沮丧。也欢迎提供文档链接。

9 个答案:

答案 0 :(得分:173)

如果您有此设置

/app
   /public/index.html
   /media

然后这应该得到你想要的东西

var express = require('express');
//var server = express.createServer();
// express.createServer()  is deprecated. 
var server = express(); // better instead
server.configure(function(){
  server.use('/media', express.static(__dirname + '/media'));
  server.use(express.static(__dirname + '/public'));
});

server.listen(3000);

诀窍是将这一行留作最后一个后备

  server.use(express.static(__dirname + '/public'));

至于文档,由于Express使用连接中间件,我发现直接查看连接源代码更容易。

例如,此行显示支持index.html https://github.com/senchalabs/connect/blob/2.3.3/lib/middleware/static.js#L140

答案 1 :(得分:120)

在最新版本的express中,不推荐使用“createServer”。这个例子对我有用:

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

//app.use(express.static(__dirname)); // Current directory is root
app.use(express.static(path.join(__dirname, 'public'))); //  "public" off of current is root

app.listen(80);
console.log('Listening on port 80');

答案 2 :(得分:82)

express.static()期望第一个参数是目录的路径,而不是文件名。我建议创建另一个子目录以包含您的index.html并使用它。

在快递documentationmore detailed serve-static documentation中提供静态文件,包括default behavior of serving index.html

  

默认情况下,此模块将发送“index.html”文件以响应目录上的请求。要禁用此设置false或提供新索引,请按首选顺序传递字符串或数组。

答案 3 :(得分:31)

res.sendFile& express.static这两个都适用于此

var express = require('express');
var app = express();
var path = require('path');
var public = path.join(__dirname, 'public');

// viewed at http://localhost:8080
app.get('/', function(req, res) {
    res.sendFile(path.join(public, 'index.html'));
});

app.use('/', express.static(public));

app.listen(8080);

其中public是客户端代码所在的文件夹

suggested@ATOzTOA clarified by @Vozziepath.join将路径作为参数加入,+传递一个参数路径。

答案 4 :(得分:1)

  

npm install serve-index

var express    = require('express')
var serveIndex = require('serve-index')
var path = require('path')
var serveStatic = require('serve-static')
var app = express()
var port = process.env.PORT || 3000;
/**for files */
app.use(serveStatic(path.join(__dirname, 'public')));
/**for directory */
app.use('/', express.static('public'), serveIndex('public', {'icons': true}))

// Listen
app.listen(port,  function () {
  console.log('listening on port:',+ port );
})

答案 5 :(得分:1)

在app.js中使用以下内容

app.use(express.static('folderName'));

(folderName是包含文件的文件夹)-记住这些资产是通过服务器路径直接访问的(即http://localhost:3000/abc.png(其中abc.png在folderName文件夹中)

答案 6 :(得分:0)

$v

答案 7 :(得分:0)

如果您有复杂的文件夹结构,例如

- Your application
     - assets
         - images
             - profile.jpg
     - web
     - server
        - index.js

如果您想从assets/images投放index.js

app.use('/images', express.static(path.join(__dirname, '..', 'assets', 'images')))

要通过浏览器查看

http://localhost:4000/images/profile.jpg

如果您需要更多澄清说明,我会详细说明。

答案 8 :(得分:0)

我会在 express docs 上添加一些内容,但有时会在教程或其他内容中被误读。

app.use(mountpoint, middleware) 
// mount point fakes being `/`

现在

app.use('/static', express.static('public')`

会将路径为 /static/hell/meow/a.js 的文件发送到 /public/hell/meow/a.js