节点需要绝对路径

use*_*880 22 javascript directory node.js express

我有一个如下所示的目录:

-- app/
   |- models/
      |- user.js
   |- config.json
Run Code Online (Sandbox Code Playgroud)

我想要我的user.js文件config.json.现在我正在使用,require('/config')但这不起作用.我究竟做错了什么?我想避免使用require('../config').

Owe*_*wen 21

简单的答案是你没有做错任何事.通过一些研究,require函数寻找以下之一:

  • 一个核心模块,如fs
  • 您在require调用中指定的相对文件路径
  • 目录搜索node_modules文件夹中适当命名的模块,该文件夹位于调用require函数的文件的父目录中的某个位置.

请参阅:http://www.bennadel.com/blog/2169-Where-Does-Node-js-And-Require-Look-For-Modules-.htm 和:http://nodejs.org/api/modules. HTML#loading_from_node_modules_Folders

上面的两个资源都引用了修改NODE_PATH环境变量的能力,但这听起来非常糟糕,至少会使你的代码变得不那么便携.它甚至可能不适用于像config.json这样的文件,因为虽然我从来没有这样做过,但我想更改NODE_PATH变量只会在require()查找与真实模块对应的package.json文件时发生变化.

总结一下,请参阅:如何使node.js中的require始终相对于项目的根文件夹?如上所述Piotr Kowalczuk.根据该帖子,您有两个真正的选择:

  1. 使用相对文件路径.
  2. 将所需资源打包为具有package.json文件的实际模块,并将其放入node_modules文件夹中.

最后,请记住,您尝试做的事情违背了您正在使用的程序.我认为这是一个案例,你最终会通过使用Node的粒度和使用相对文件路径来使你的生活更轻松(和你的合作者!).


sul*_*tan 11

我找不到比编写自己的模块更好的解决方案.

所以,我喜欢干净的代码,里面这么丑陋的道路require正在杀了我.我找到了许多解决方案如何解决它,但我喜欢的是在Linux系统下完美但不适用于Windows.然后我决定解决它.

性感要求

在一些项目中测试后,我决定将其作为开源.

const user = require('../../../database/user'); //  what you have
// OR
const user = require('$db/user'); //  no matter how deep you are
const product = require('/database/product'); //  alias or pathing from root directory
Run Code Online (Sandbox Code Playgroud)


入门

使用它的三个简单步骤.

  1. 安装包: npm install sexy-require --save

  2. require('sexy-require')在主应用程序文件的顶部包含一次.

    require('sexy-require');
    const routers = require('/routers');
    const api = require('$api');
    ...
    
    Run Code Online (Sandbox Code Playgroud)
  3. 可选步骤.路径配置可以在.paths项目根目录下的文件中定义.

    $db = /server/database
    $api-v1 = /server/api/legacy
    $api-v2 = /server/api/v2
    
    Run Code Online (Sandbox Code Playgroud)


路径列表

在项目的任何位置,您都可以获得定义的快捷方式路径

    const path = require(`sexy-require`);
    console.log(path.$db); // -> '/full/path/to/app/server/database'
Run Code Online (Sandbox Code Playgroud)