Сейчас я работаю над проектом, построенным на NODE
. Я разрабатываю API для проекта. Когда я запускаю сервер, API работает нормально. Итак, на следующем шаге я пишу тестовый пример для моего API. Это дает мне неожиданный результат. Мой код падает в моем файле config.js
. После некоторой отладки я обнаружил, что он не может принимать входные данные от process.ENV
. Однако я не понимаю, почему это не может. Я определяю файл .env
в моей корневой папке. Я делюсь своими файлами folder structure
, config.js
, test.js
и .env
здесь. Пожалуйста, проверьте это и дайте мне знать, что я пропустил здесь.
Структура папок
project
│ README.md
│ config
| |___config.js
│
└───server
│ │
│ │___helpers
│ │
│ └───registration
│ │______ user
| |_____ user.route.js
│ |_____ user.model.js
| |_____ user.controller.js
│ |_____ user.test.js
│
|───.env
|___ package.json
|___ index.js
|___ index.route.js
config.js
const Joi = require('joi');
// require and configure dotenv, will load vars in .env in PROCESS.ENV
require('dotenv').config();
console.log(process.env.PORT);
// define validation for all the env vars
const envVarsSchema = Joi.object({
NODE_ENV: Joi.string()
.allow(['development', 'production', 'test', 'provision'])
.default('development'),
PORT: Joi.number()
.default(4040),
MONGOOSE_DEBUG: Joi.boolean()
.when('NODE_ENV', {
is: Joi.string().equal('development'),
then: Joi.boolean().default(true),
otherwise: Joi.boolean().default(false)
}),
JWT_SECRET: Joi.string().required()
.description('JWT Secret required to sign'),
MONGO_HOST: Joi.string().required()
.description('Mongo DB host url'),
MONGO_PORT: Joi.number()
.default(27017)
}).unknown()
.required();
const { error, value: envVars } = Joi.validate(process.env, envVarsSchema);
if (error) {
throw new Error(`Config validation error: ${error.message}`);
}
const config = {
env: envVars.NODE_ENV,
port: envVars.PORT,
mongooseDebug: envVars.MONGOOSE_DEBUG,
jwtSecret: envVars.JWT_SECRET,
mongo: {
host: envVars.MONGO_HOST,
port: envVars.MONGO_PORT
}
};
module.exports = config;
user.test.js
const mongoose = require('mongoose');
const request = require('supertest-as-promised');
const httpStatus = require('http-status');
const chai = require('chai'); // eslint-disable-line import/newline-after-import
const expect = chai.expect;
const app = require('../../../index');
chai.config.includeStack = true;
/**
* root level hooks
*/
after((done) => {
mongoose.models = {};
mongoose.modelSchemas = {};
mongoose.connection.close();
done();
});
describe('## User APIs', () => {
let user = {
name: 'KK123',
gender: 'male',
skillArea: 'nodeJs',
email: 'a@a.com',
mobileNumber: '1234567890',
password: '123456'
};
describe('# POST /api/v1/register/user', () => {
it('should create a new user', (done) => {
request(app)
.post('/api/v1/register/user')
.send(user)
.expect(httpStatus.OK)
.then((res) => {
expect(res.body.name).to.equal(user.name);
expect(res.body.gender).to.equal(user.gender);
expect(res.body.skillArea).to.equal(user.skillArea);
expect(res.body.email).to.equal(user.email);
expect(res.body.mobileNumber).to.equal(user.mobileNumber);
expect(res.body.password).to.equal(user.password);
user = res.body;
done();
})
.catch(done);
});
});
});
.env
NODE_ENV=development
PORT= 4040
JWT_SECRET = "Testpurposeonly"
MONGO_HOST = mongodb://localhost/user
MONGO_PORT = 27017