app.use(express.static(__dirname + '/public')) 和 app.use(express.static('public')) 的区别;

问题描述

不知道下面两个是不是一样的。

(1) app.use(express.static(__dirname + "/public"));
(2) app.use(express.static("public"));

因为我认为只要 (2) 存在于 express 服务器中,浏览器就可以提供位于根路径中的 public 文件夹,而 __dirname 不是必需的。

但是,有时 (2) 不起作用而 (1) 起作用,例如我在基于 Route parameters 的动态路由中呈现 ejs 文件

它们之间到底有什么区别?

解决方法

首先__dirname有3个用法,你可以查看documentation

制作新目录

要在 index.js 文件中创建一个新目录,请插入 __dirname 作为 path.join() 的第一个参数,并将新目录的名称作为第二个参数插入

const fs = require('fs');
const path = require('path');
const dirPath = path.join(__dirname,'/pictures');

fs.mkdirSync(dirPath);

指向目录

另一个独特的功能是它能够指向目录。在你的 index.js 文件中,声明一个变量并传入 __dirname 的值作为 path.join() 的第一个参数,你的包含静态文件的目录作为第二个参数

express.static(path.join(__dirname,'/public'));

将文件添加到目录

您也可以将文件添加到现有目录。在你的 index.js 文件,声明一个变量并包含 __dirname 作为第一个参数 以及您要添加为第二个的文件 如果您运行 express 应用程序 从另一个目录(不是根目录),使用绝对路径更安全 在您要提供的目录中,使用 __dirname

const fs = require('fs');
const path = require('path');
const filePath = path.join(__dirname,'/pictures');

fs.openSync(filePath,'hello.jpeg');

根据您的示例,我们不能使用 __dirname 但如果您从另一个目录运行 express 应用程序,则使用您想要提供服务的目录的绝对路径会更安全

app.use(express.static(__dirname + "/public"));