除了process.cwd()之外,是否有其他方法来获取当前项目根目录的路径名。Node是否实现了ruby的属性Rails.root之类的东西。我要找的是稳定可靠的东西。
当前回答
一个非常简单和可靠的解决办法是cd ..递归地搜索包。Json,考虑到这个文件总是在项目根目录。
const fs = require('fs')
const path = require('path')
function getAppRootDir () {
let currentDir = __dirname
while(!fs.existsSync(path.join(currentDir, 'package.json'))) {
currentDir = path.join(currentDir, '..')
}
return currentDir
}
其他回答
在使用express时,我发现一个有用的技巧是在设置任何其他路由之前将以下内容添加到app.js中
// set rootPath
app.use(function(req, res, next) {
req.rootPath = __dirname;
next();
});
app.use('/myroute', myRoute);
不需要使用全局变量,您可以将根目录的路径作为请求对象的属性。
如果你的app.js在你的项目的根目录中,这是有效的,默认情况下,它是。
const __root = `${__dirname.substring(0, __dirname.lastIndexOf('projectName'))}projectName`
`
我发现这对我来说是一致的,即使应用程序是从子文件夹中调用的,因为它可以与一些测试框架,如Mocha:
process.mainModule.paths[0].split('node_modules')[0].slice(0, -1);
为什么有效:
在运行时,节点创建所有加载文件的完整路径的注册表。模块首先加载,因此位于注册表的顶部。通过选择注册表的第一个元素并返回'node_modules'目录之前的路径,我们可以确定应用程序的根目录。
它只有一行代码,但为了简单起见(我的),我把它黑盒到一个NPM模块:
https://www.npmjs.com/package/node-root.pddivine
享受吧!
编辑:
的过程。mainModule从v14.0.0开始已弃用
使用要求。主要:
require.main.paths [0] .split(“node_modules”)[0]。片(0,1);
你可以简单地在express app变量中添加根目录路径,并从app中获取这个路径。在index.js或app.js文件中。并使用req.app.get('rootDirectory')在代码中获取根目录路径。
__dirname会给你根目录,只要你在根目录下的文件中。
// ProjectDirectory.js (this file is in the project's root directory because you are putting it there).
module.exports = {
root() {
return __dirname;
}
}
在其他文件中:
const ProjectDirectory = require('path/to/ProjectDirectory');
console.log(`Project root directory is ${ProjectDirectory.root}`);
推荐文章
- 在用nodejs和express创建的REST API中设置响应状态和JSON内容的正确方法
- 如何获得请求路径与表达请求对象
- 节点和错误:EMFILE,打开的文件太多
- 没有定义Electron require()
- 在摩卡测试时调用异步函数如何避免超时错误:超时超过2000ms
- package.json中属性“private”的目的是什么?
- 用套接字发送消息到指定客户端。IO和node.js
- 当我运行' npm install '时,它返回' ERR!代码EINTEGRITY ' (npm 5.3.0)
- 我如何使用Node.js Crypto创建HMAC-SHA1哈希?
- 如何在package.json中使用“main”参数?
- NPM清洁模块
- 在Node.js中加载基本HTML
- Node.js和CPU密集型请求
- 为什么在节点REPL中没有定义__dirname ?
- 在Node.js中克隆对象