【问题标题】:node.js: require json file returns MODULE NOT FOUNDnode.js:需要 json 文件返回 MODULE NOT FOUND
【发布时间】:2020-02-02 10:52:39
【问题描述】:

我正在尝试将 json 数组存储到变量中,但 node.js 返回此错误:{ Error: Cannot find module 'jokes.json'

这是我的代码:

let jsonData = require('jokes.json');
var jokes = jsonData.jokes;

jokes.json 文件与 javascript 文件位于同一目录中

【问题讨论】:

标签: javascript node.js json require discord.js


【解决方案1】:

如果您只想快速获得答案,则需要更改为:

let jsonData = require('./jokes.json');

指示 nodejs 模块加载器在当前模块的目录中查找jokes.json。是的,这对于一个 node.js 新手来说有点令人惊讶,但有一些方法可以解决这个问题(见下文)。


通过相对路径加载模块的所有规则都在此处描述:https://nodejs.org/api/modules.html#modules_all_together。我真的建议阅读它。

为了便于讨论,我将在此处包含一部分:

require(X) from module at path Y
1. If X is a core module,
   a. return the core module
   b. STOP
2. If X begins with '/'
   a. set Y to be the filesystem root
3. If X begins with './' or '/' or '../'
   a. LOAD_AS_FILE(Y + X)
   b. LOAD_AS_DIRECTORY(Y + X)
4. LOAD_NODE_MODULES(X, dirname(Y))
5. THROW "not found"

LOAD_AS_FILE(X)
1. If X is a file, load X as JavaScript text.  STOP
2. If X.js is a file, load X.js as JavaScript text.  STOP
3. If X.json is a file, parse X.json to a JavaScript Object.  STOP
4. If X.node is a file, load X.node as binary addon.  STOP

LOAD_INDEX(X)
1. If X/index.js is a file, load X/index.js as JavaScript text.  STOP
2. If X/index.json is a file, parse X/index.json to a JavaScript object. STOP
3. If X/index.node is a file, load X/index.node as binary addon.  STOP

LOAD_AS_DIRECTORY(X)
1. If X/package.json is a file,
   a. Parse X/package.json, and look for "main" field.
   b. If "main" is a falsy value, GOTO 2.
   c. let M = X + (json main field)
   d. LOAD_AS_FILE(M)
   e. LOAD_INDEX(M)
   f. LOAD_INDEX(X) DEPRECATED
   g. THROW "not found"
2. LOAD_INDEX(X)

LOAD_NODE_MODULES(X, START)
1. let DIRS = NODE_MODULES_PATHS(START)
2. for each DIR in DIRS:
   a. LOAD_AS_FILE(DIR/X)
   b. LOAD_AS_DIRECTORY(DIR/X)

NODE_MODULES_PATHS(START)
1. let PARTS = path split(START)
2. let I = count of PARTS - 1
3. let DIRS = [GLOBAL_FOLDERS]
4. while I >= 0,
   a. if PARTS[I] = "node_modules" CONTINUE
   b. DIR = path join(PARTS[0 .. I] + "node_modules")
   c. DIRS = DIRS + DIR
   d. let I = I - 1
5. return DIRS

因为require('jokes.json') 不是以/. 开头的,所以您的require() 语句是这样的:

4. LOAD_NODE_MODULES(X, dirname(Y))

然后调用

NODE_MODULES_PATHS(START)

它构建了一个搜索路径列表,其中包括加载当前脚本的目录名称以及附加的“/node_modules”子目录任何全局模块安装位置。它不会包含加载当前模块的目录。

【讨论】:

    【解决方案2】:

    如果你要导入一些自定义模块或文件,你必须在下面要求它(使用相对路径)

    let jsonData = require('./jokes.json');
    

    对于系统模块,你可以通过这种方式导入 const express = require('express')

    如果您在您的文件夹名称 express 中创建另一个模块并且您需要这种方式

    const express = `require('./express')`
    

    它将找到您的自定义 express.js 文件而不是 express 模块

    【讨论】:

    • 不是相对路径吗?
    猜你喜欢
    • 2012-08-16
    • 2020-01-23
    • 1970-01-01
    • 2019-06-27
    • 2016-03-16
    • 2021-07-10
    • 2023-01-08
    • 2018-01-23
    • 2013-04-22
    相关资源
    最近更新 更多