Основной модуль Node.js «fs» не найден, когда @fastify/static развернут на render.com
Насколько я понимаю, основные модули, такие как «fs», являются частью сборки node.js, и никакой специальной настройки не требуется, чтобы сделать их доступными для импорта, поэтому я не понимаю, как «fs» может быть отсутствует при запуске на render.com. У меня нет проблем со сборкой или запуском в режиме разработки локально. И сервис отлично развертывается и строится на render.com, но работает с ошибкой:
Jan 31 01:13:22 PM ==> Starting service with 'node index.js'
Jan 31 01:13:23 PM internal/modules/cjs/loader.js:888
Jan 31 01:13:23 PM throw err;
Jan 31 01:13:23 PM ^
Jan 31 01:13:23 PM
Jan 31 01:13:23 PM **Error: Cannot find module 'node:fs'**
Jan 31 01:13:23 PM Require stack:
Jan 31 01:13:23 PM - /opt/render/project/src/node_modules/@fastify/send/lib/SendStream.js
Jan 31 01:13:23 PM - /opt/render/project/src/node_modules/@fastify/send/index.js
Jan 31 01:13:23 PM - /opt/render/project/src/node_modules/@fastify/static/index.js
Jan 31 01:13:23 PM - /opt/render/project/src/index.js
Jan 31 01:13:23 PM at Function.Module._resolveFilename (internal/modules/cjs/loader.js:885:15)
Jan 31 01:13:23 PM at Function.Module._load (internal/modules/cjs/loader.js:730:27)
Jan 31 01:13:23 PM at Module.require (internal/modules/cjs/loader.js:957:19)
Jan 31 01:13:23 PM at require (internal/modules/cjs/helpers.js:88:18)
Jan 31 01:13:23 PM at Object.<anonymous> (/opt/render/project/src/node_modules/@fastify/send/lib/SendStream.js:10:12)
Jan 31 01:13:23 PM at Module._compile (internal/modules/cjs/loader.js:1068:30)
Jan 31 01:13:23 PM at Object.Module._extensions..js (internal/modules/cjs/loader.js:1097:10)
Jan 31 01:13:23 PM at Module.load (internal/modules/cjs/loader.js:933:32)
Jan 31 01:13:23 PM at Function.Module._load (internal/modules/cjs/loader.js:774:14)
Jan 31 01:13:23 PM at Module.require (internal/modules/cjs/loader.js:957:19) {
Jan 31 01:13:23 PM code: 'MODULE_NOT_FOUND',
Jan 31 01:13:23 PM requireStack: [
Jan 31 01:13:23 PM '/opt/render/project/src/node_modules/@fastify/send/lib/SendStream.js',
Jan 31 01:13:23 PM '/opt/render/project/src/node_modules/@fastify/send/index.js',
Jan 31 01:13:23 PM '/opt/render/project/src/node_modules/@fastify/static/index.js',
Jan 31 01:13:23 PM '/opt/render/project/src/index.js'
Jan 31 01:13:23 PM ]
Jan 31 01:13:23 PM }
Служба работала весело, пока сегодня я не развернул новую версию, для которой требуется пакет @fastify/static, например:
fastify.register(require('@fastify/static'), { root: path.join(__dirname,'public'), prefix:'/public/' })
Я никогда не импортирую «fs» напрямую, но, по-видимому, @fastify/static делает это, например:
const statSync = require('fs').statSync
Я пытался явно импортировать fs перед импортом @fastify, но ошибка не меняется. Webpack не участвует. Я пытался строить с использованием как npm, так и пряжи, без разницы - не то, чтобы сборка затрагивала основные модули. Есть ли какая-то критическая настройка среды, которую я забыл сделать на Render.com?
1 ответ
Комментарий Ронни (спасибо!) заставил меня задуматься, верно ли мое предположение, что «node:fs» совпадает с «fs». Не было. Render.com по умолчанию использует node.js версии 14.17.0. Синтаксис ссылки на модуль «node:» не был добавлен до более поздней версии.
Решение состояло в том, чтобы запросить версию узла 16.0.0 на сайте render.com, используя переменную среды, содержащую строку версии, и это исправило ошибку.
Подробная информация об указании версии на сайте render.com находится по адресу https://render.com/docs/node-version .
Объяснение синтаксиса основных модулей находится по адресу https://nodejs.org/api/modules.html .