在node.js Express框架中设置两个不同的静态目录

sNi*_*CKY 91 static node.js express duostack

可能吗?我想设置两个不同的目录来提供静态文件.让我们说/ public和/ mnt

小智 141

您还可以通过指定其他(第一个)参数来设置将静态文件提供给Web的路径use():

app.use("/public", express.static(__dirname + "/public"));
app.use("/public2", express.static(__dirname + "/public2"));
Run Code Online (Sandbox Code Playgroud)

这样,您可以在Web上获得镜像本地目录的两个不同目录,而不是在两个本地目录之间进行故障转移的一个URL路径.

换句话说,URL模式:

http://your.server.com/public/*
Run Code Online (Sandbox Code Playgroud)

从以下位置提供本地目录中的文件public:

http://your.server.com/public2/*
Run Code Online (Sandbox Code Playgroud)

提供本地目录中的文件public2.

顺便说一句,如果您不希望静态服务器从服务器的根目录提供文件,而是从更合格的路径提供服务,这也很有用.

HTH

  • 如果使用 React 并尝试为两个单独的应用程序提供服务,则需要将 `"homepage": "/public"` 和 `"homepage": "/public2"` 添加到相应的 React 应用程序的 package.json 中。有关使用两个 React 应用程序的更多信息,请参阅我的答案 /sf/answers/3399892751/ (4认同)
  • 完美的@facetcounter!只是将脚本指向我的目录!脚本(src =“/ public2/alertTest.js”) (2认同)

Ran*_*pho 51

您还可以将目录"合并"到一个可见目录中

目录结构

  • /static
  • /alternate_static

app.use("/static", express.static(__dirname + "/static"));
app.use("/static", express.static(__dirname + "/alternate_static"));
Run Code Online (Sandbox Code Playgroud)

static和alternate_static都将被视为位于同一目录中.但请注意文件名clobbers.

  • 如果我理解正确,文件名冲突不会发生,因为节点使用它找到的文件的第一个版本.如果它在`static /`中看到`main.js`,它将不会继续查看`alternate_static /`. (6认同)
  • 如果您希望"alternate_static"中的文件能够被提供,那么这仍然是一个瑕疵. (2认同)

Phi*_*lev 40

一次中间件注入是不可能的,但您可以static多次注入中间件:

app.configure('development', function(){
    app.use(express.static(__dirname + '/public1'));
    app.use(express.static(__dirname + '/public2'));
});
Run Code Online (Sandbox Code Playgroud)

说明

看看connect/lib/middleware/static.js#143:

path = normalize(join(root, path));
Run Code Online (Sandbox Code Playgroud)

存在options.root静态根,您在其中定义express.staticconnect.static调用,并且path是请求路径.

查看connect/lib/middleware/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);
Run Code Online (Sandbox Code Playgroud)

路径只检查一次,如果找不到文件请求传递给下一个中间件.

Connect 2.x的更新

代码链接对于Connect 2.x来说是实际的,但是多个静态中间件的使用仍然像以前一样可用.


小智 5

我也遇到了同样的问题,但经过长时间的搜索这个任务后,我设法解决了它。

步骤1:

在 /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>')));
Run Code Online (Sandbox Code Playgroud)

第2步:

我的计划是在单个 NodeJS 服务器中部署两个 Angular 客户端应用程序。

所以我在两个 Angular 客户端应用程序上运行了“ng build”

我将一个 dist 文件夹放在“/public”文件夹中,将另一个 dist 文件夹放在“/mnt”文件夹中。

步骤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>
Run Code Online (Sandbox Code Playgroud)

需要修改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>
Run Code Online (Sandbox Code Playgroud)

重要提示:根据静态文件夹服务路径更改 .js 文件路径。

步骤4:

在一条路径中,您可以为公众服务,在另一条路径中,您可以为 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'));
})
Run Code Online (Sandbox Code Playgroud)

现在你可以走了。运行并测试它。