node.js требует возврата МОДУЛЬ НЕ НАЙДЕН - PullRequest
0 голосов
/ 04 октября 2019

Я пытаюсь сохранить массив json в переменной, но node.js возвращает эту ошибку: { Error: Cannot find module 'jokes.json'

Вот мой код:

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

Шутки. Файл json находится в том же каталоге, что и файл javascript

Ответы [ 2 ]

1 голос
/ 04 октября 2019

Если вы просто хотите получить быстрый ответ, вам нужно изменить его на:

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" в любых местах установки глобального модуля. Он не будет включать каталог, из которого был загружен текущий модуль.

1 голос
/ 04 октября 2019

если вы импортируете какой-то пользовательский модуль или файл, вам нужно указать это ниже (используя относительный путь)

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

, а для системного модуля вы можете импортировать этот способ const express = require('express')

если вы создадите другой модуль в вашем имени папки express, и если вам потребуется это таким образом

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

, он найдет ваш файл custom express.js, а не модуль express

...