Setting up two different static directories in node.js Express framework

Is it possible? I would like to set up two different directories to serve static files. Let's say /public and /mnt

70538 次浏览

通过一个中间件注入是不可能的,但是您可以多次注入 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.staticconnect.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 的路径,如下所示:

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:

http://your.server.com/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代替 *

例句

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