如何服务器特定的静态文件与express.js

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

我有

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

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

什么好主意吗?


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

473468 次浏览

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

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

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

如果你有这样的设置

/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 < / p >

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

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

正如建议 by @ATOzTOA澄清的 @Vozzie一样,path.join以要连接的路径作为参数,+将单个参数传递给path。

NPM安装server -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 );
})

在你的app.js中使用下面的方法

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

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

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

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

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

如果你想从index.js提供assets/images

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

从浏览器查看

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

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

我会添加一些在表达文档上的东西,它有时会在教程或其他教程中被误读。

app.use(mountpoint, middleware)

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

现在

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

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

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

可以通过传递第二个参数express.static()方法来指定文件夹中的索引文件来实现这一点

const express = require('express');
const app = new express();
app.use(express.static('/media'), { index: 'whatever.html' })