我正在尝试在app.js文件中为项目添加静态文件夹。我正在使用macOS。
app.use(express.static("public")); // will work
app.use(express.static("\public")); // will work
app.use(express.static("/public")); // wont work
有人可以告诉我这三个之间有什么区别。
“公共”文件夹位于项目文件中。 这样-> My_project>(public,app.js,node_modules)
const express = require("express");
const bodyParser = require("body-parser");
const request = require("request");
const app = express();
app.use(bodyParser.urlencoded({extended:true}));
app.use(express.static("public"));
答案 0 :(得分:2)
首先,不清楚您使用的是哪个操作系统。在第二个示例中,您好像正在使用Windows(因为这是唯一使用“ \”字符作为目录分隔符的操作系统)。我在node上的经验仅限于Linux,但是我认为它应该在Windows上也可以使用...
编辑 MacOS实际上是一个“类似Linux的”操作系统,因此下面对Linux的讨论同样适用于MacOS。
因此,回答关于三个不同的“公共”路径的第一个问题:
app.use(express.static("public"));
将使用相对于您启动节点应用程序的位置的public
目录。因此,如果您在目录“ src”中,而“公共”目录在“ src”目录中,则它将为该“公共”目录中的文件提供服务。
app.use(express.static("\public"));
(我认为)的工作方式与前面的示例相同。这是使用Windows路径分隔符,因此这是我不太熟悉的行为。
app.use(express.static("/public"));
将尝试从Linux系统上文件系统根目录中的“公共”目录提供公共文件。这实际上是一种不寻常的用法-通常,您不会在文件系统根目录中创建公共文件目录。您将更有可能使用第一个版本(或略有不同的路径说明,它表示相同的内容,例如./public
)。
因此,您的示例给出了三种不同的路径规范,在不同的操作系统上具有不同的含义。您如何避免这种混乱?
Node为这种混乱提供了一种解决方案:path模块。具体来说,提供了path.join
方法来构造在您的操作系统上可以正常工作的路径。
我经常使用的一种模式是通过使它相对于当前文件相对应来确保准确获得所需的文件/目录,如下所示:
app.use(express.static(path.join(__dirname, 'public')));
想象一下,该文件位于名为C:\development\myproject\index.js
的文件中,而您的静态资产位于C:\development\myproject\index.js
中。这段代码最终将像这样工作:
app.use(express.static('C:\development\myproject\public'));
通过path.join
方法构造路径的地方。
而且,如果将来您切换到Linux(或者让其他开发人员在他们的Linux机器上从事该项目),则无需更改代码即可更新路径。
答案 1 :(得分:1)
我相信
app.use(express.static("public"));
这会将./public
文件夹内容用作静态文件。 (默认行为)
app.use(express.static("\public"));
这也将服务于./public
文件夹,因为您只是在转义p
(就像用"
转义\"
一样)。由于p和转义的p是相同的值,因此将按预期工作。
app.use(express.static("/public"));
这会尝试提供/public
文件夹。 /
没有任何.
的意思是root,因此它将尝试访问本地驱动器的根目录,并检查其中是否存在public
目录。
您可以通过在public
中创建一个名为root
的目录并在其中创建文件来进行测试。