Is it possible? I would like to set up two different directories to serve static files. Let's say /public and /mnt
通过一个中间件注入是不可能的,但是您可以多次注入 static中间件:
static
app.configure('development', function(){ app.use(express.static(__dirname + '/public1')); app.use(express.static(__dirname + '/public2')); });
解释
Look at Connect/lib/Middle ware/static.js # 143:
path = normalize(join(root, path));
有 options.root是静态根,这是您在 express.static或 connect.static调用中定义的,而 path是请求路径。
options.root
express.static
connect.static
path
再看看 Connect/lib/Middle ware/static.js # 154连接/库/中间件/static.js # 154:
fs.stat(path, function(err, stat){ // ignore ENOENT if (err) { if (fn) return fn(err); return ('ENOENT' == err.code || 'ENAMETOOLONG' == err.code) ? next() : next(err);
路径只检查一次,如果文件没有找到请求传递到下一个中间件。
更新连接2. x
对于 Connect 2.x,指向代码的链接并不实际,但是仍然可以像以前一样使用多个静态中间件。
您还可以通过向 use()指定一个额外的(第一个)参数来设置静态文件将从中提供给 Web 的路径,如下所示:
use()
app.use("/public", express.static(__dirname + "/public")); app.use("/public2", express.static(__dirname + "/public2"));
这样你就可以在网络上得到两个不同的目录,它们反映了你的本地目录,而不是一个在两个本地目录之间失败的 URL 路径。
换句话说,URL 模式:
http://your.server.com/public/*
Serves files from the local directory public while:
public
http://your.server.com/public2/*
从本地目录 public2提供文件。
public2
顺便说一句,如果你不想静态服务器的根文件,而是从一个更合格的路径,这是非常有用的。
高温
还可以将目录“合并”到单个可见目录中
目录结构
/static
/alternate_static
Code
app.use("/static", express.static(__dirname + "/static")); app.use("/static", express.static(__dirname + "/alternate_static"));
Static 和 other _ static 都将像在同一个目录中一样提供服务。不过,要注意文件名修改器。
const express = require('express'); const path = require('path'); const pagesPath = path.join(__dirname, '/cheatsheet'); const cssPath = path.join(__dirname, '/stylesheet'); const port = process.env.PORT || 3000; var app = express(); app.use("/cheatsheet" ,express.static(pagesPath)); app.use("/stylesheet",express.static(cssPath)); app.get('/',(request,response)=>{ response.send('Hello CSS!!!'); }); app.get('/bad',(request,response)=>{ response.send({error: 'Bad Request'}); }); app.listen(port, ()=> { console.log(`Server is running on Port ${port}` ); console.log(__dirname);
});
// folder structure /cheatsheet/index.html /stylesheet/style.css
使用 :dir代替 *
:dir
*
例句
this.app.use('/:microsite', express.static(path.resolve(process.cwd(), 'client/')))
我也面临同样的问题,但我设法解决它,经过长期寻找这个任务。
第一步:
在/public 和/mnt 的路径名中提供静态文件
app.use('/public', express.static(path.join(__dirname, '<path_to_the_folder_you_want_to_serve_public>'))); app.use('/mnt', express.static(path.join(__dirname, '<path_to_the_folder_you_want_to_serve_mnt>')));
第二步:
我的计划是在一台 NodeJS 服务器上部署两个 Angular 客户机应用程序。
所以我在两个 Angular 客户端应用上都运行了 ‘ ng build’。
我在“/public”文件夹中放置了一个 dist 文件夹,在“/mnt”中放置了另一个 dist 文件夹。
Step 3:
需要通过更改以下内容来修改 index.html,以显示公用文件夹内容,
<script src="./public/runtime.js" defer></script> <script src="./public/polyfills.js" defer></script> <script src="./public/styles.js" defer></script> <script src="./public/vendor.js" defer></script> <script src="./public/main.js" defer></script>
需要通过更改以下内容来修改 index.html,以显示 mnt 文件夹内容,
<script src="./mnt/runtime.js" defer></script> <script src="./mnt/polyfills.js" defer></script> <script src="./mnt/styles.js" defer></script> <script src="./mnt/vendor.js" defer></script> <script src="./mnt/main.js" defer></script>
Important Note : Change the .js files path based on the static folder serving path.
第四步:
In one path, you can serve public and on another you can serve mnt.
app.get('/', function(req, res) => { res.sendFile(path.join(__dirname, '../public/dist/index.html')); }) app.get('/', function(req, res) => { res.sendFile(path.join(__dirname, '../mnt/dist/index.html')); })
现在可以开始了,运行并测试它。
在自定义中间件中使用 express.static:
app.use(customMiddleware())
where
const customMiddleware = function() { return function(req, res, next) { // do some dynamic code // or return express.static(__dirname + "/public")(req, res, next); } }
我们可以根据特定的路由在 nodejs 服务器中动态地启用静态文件
app.use("/test", (req, res, next) => { if (req.session.isAuth === undefined) { let middleware = express.static(path.join(__dirname, "staticPages")); middleware(req, res, next); } else { next(); } });