我想服务index.html和/media子目录作为静态文件。索引文件应该同时在/index.html和/ URLs中提供。

我有

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

但是第二行显然提供了整个__dirname,包括其中的所有文件(不仅仅是index.html和media),这是我不想要的。

我也试过

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

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

什么好主意吗?


顺便说一下,我在Express中绝对找不到关于这个主题的文档(static() +它的params)…令人沮丧。文档链接也很受欢迎。


当前回答

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

其他回答

res.sendFile & express。静态两者都适用

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

客户端代码所在的文件夹在哪里是公共的

根据@ATOzTOA的建议,并由@Vozzie澄清,路径。Join以Join的路径作为参数,+则将单个参数传递给path。

在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');

这是我在提供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')));
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')
})

如果你有这样的设置

/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