247

我想将子目录作为静态文件index.html提供服务。/media索引文件应同时提供 at/index.html/URL。

我有

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

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

我也试过

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

但是访问基本 URL/然后会导致对web_server/index.html/index.html(双index.html组件)的请求,这当然会失败。

有任何想法吗?


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

4

10 回答 10

212

如果你有这个设置

/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

于 2012-05-04T07:57:30.223 回答
148

在 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');
于 2013-05-13T14:32:40.297 回答
116

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

在 Express文档更详细的serve-static文档中提供静态文件,包括服务的默认行为index.html

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

于 2012-05-03T22:25:51.280 回答
53

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客户端代码所在的文件夹在哪里

正如@ATOzTOA所建议@Vozzie所阐明的 那样path.join将要加入的路径作为参数,+将单个参数传递给路径。

于 2017-04-09T22:43:36.913 回答
8
const path = require('path');

const express = require('express');

const app = new express();
app.use(express.static('/media'));

app.get('/', (req, res) => {
    res.sendFile(path.resolve(__dirname, 'media/page/', 'index.html'));
});

app.listen(4000, () => {
    console.log('App listening on port 4000')
})
于 2019-04-02T05:35:52.073 回答
6

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

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

如果您想assets/imagesindex.js

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

从浏览器查看

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

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

于 2020-10-07T05:55:52.083 回答
3

在你的 app.js 中使用下面

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

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

于 2019-01-11T18:53:15.730 回答
3

npm 安装服务索引

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 );
})
于 2017-10-02T19:04:19.887 回答
1

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

app.use(mountpoint, middleware) 

mountpoint是一个虚拟路径,它不在文件系统中(即使它确实存在)。中间件的挂载点是app.js文件夹。

现在

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

将带有路径的文件发送/static/hell/meow/a.js/public/hell/meow/a.js

于 2021-06-29T09:52:52.390 回答
0

当我提供指向 HTML 文件的链接时,这是我的错误。

前:

<link rel="stylesheet" href="/public/style.css">

后:

<link rel="stylesheet" href="/style.css">

我刚刚从链接中删除了静态目录路径,错误就消失了。这解决了我的错误一件事,别忘了把这条线放在你正在创建服务器的地方。

var path = require('path');
app.use(serveStatic(path.join(__dirname, 'public')));
于 2021-08-27T09:33:15.607 回答