У меня есть экспресс-API (backend) внутри основной папки с файлом .env:
main
- .env
- backend
В app.js я могу подключиться к своей базе данных, используя переменную .env, например:
const dbconnect = require("./data/db");
require("dotenv").config();
dbconnect();
Однако в другом файле (seeder.js) файл/переменная .env не отображается, поэтому, если я попробую:
const dbconnect = require("./db");
require("dotenv").config();
dbconnect();
Я получил:
MongooseError: The `uri` parameter to `openUri()` must be a string, got "undefined"
Мой db файл:
const mongoose = require("mongoose");
const dbconnect = async () => {
try {
await mongoose.connect(process.env.DB);
// await mongoose.connect("mongodb://127.0.0.1:27017/recipes");
console.info("Database connected");
} catch (error) {
console.info(error);
process.exit();
}
};
module.exports = dbconnect;
Суть в следующем - app.js работает, но seeder.js не работает, почему?
main/package.json (how I launch the app)
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"client": "npm run dev --prefix frontend",
"server": "nodemon backend/bin/www",
"dev": "concurrently \"npm run server\" \"npm run client\""
},
Код не содержит объяснения этому. еслиseeder.js и app.js находятся на одном уровне (который не показан), они работают одинаково. Не показано где корень проекта. Пожалуйста, предоставьте способ воспроизведения, см. stackoverflow.com/help/mcve
@EstusFlask Я добавляю изображение с деревом файлов, это помогает? Если нет, я отправлю все это в git и предоставлю ссылку (она небольшая).
Недостаточно подробностей, чтобы воспроизвести проблему. Как вы запускаете программу в каждом случае? Изменяется ли текущий рабочий каталог?
Если вы запустите один с помощью node backend/app.js с CWD main, а другой запустите с node seeder.js с CWD main/backend/data, то он не найдет .env, потому что он находится в main/.env (что немного странно — я ожидал этого в main/backend/.env)
@Вик, хороший вопрос, и я ошибся, что не задал его. Я запускаю его из основной папки, проверьте мой отредактированный вопрос. Только что попробовал переместить его на backend, в этом случае seeder.js работает, а app.js нет. Итак, прямо сейчас я могу заставить его работать, имея 2 файла .env, один в основном и один в бэкэнде, но меня это не устраивает, я хочу, чтобы это было только в основном.
В случае, если CWD вступает в игру, вы можете настроить способ поиска правильного .env, npmjs.com/package/dotenv#path
догадаться. сеялка узла работает только в том случае, если у меня есть .env в обоих местах, мне пришлось добавить команду в package.json в основном файле, чтобы просто иметь там файл .env - "data:import": "node backend/seeder",





Просто импортируйте dotenv в db файл, например:
const mongoose = require("mongoose");
require("dotenv").config();
const dbconnect = async () => {
try {
await mongoose.connect(process.env.DB);
// await mongoose.connect("mongodb://127.0.0.1:27017/recipes");
console.info("Database connected");
} catch (error) {
console.info(error);
process.exit();
}
};
module.exports = dbconnect;
уже пробовал, не работает
Используйте синтаксис require('dotenv').config({ path: '/custom/path/to/.env' }), чтобы найти свой единственный файл .env в нужной папке. (Пожалуйста, имейте только один файл .env, но найдите его правильно.)
Вы можете использовать __dirname, чтобы получить имя каталога выполняющегося в данный момент скрипта, если это поможет.
Как заставить ~/main/backend/app.js найти ~/main/.env
const path = require('path');
const dotenv = require('dotenv');
dotenv.config({ path: path.resolve(__dirname, '..', '.env') });
Как заставить ~/main/backend/data/seeder.js найти ~/main/.env
const path = require('path');
const dotenv = require('dotenv');
// note extra '..'
dotenv.config({ path: path.resolve(__dirname, '..', '..', '.env') });
Покажите файловую систему для лучшего понимания