create-nodeapi-backend
Version:
A powerful Node.js backend boilerplate with Express, MongoDB, Firebase, JWT auth, Nodemailer, cron jobs, input validation (Joi), and serverless support for Vercel. Scaffold a full-featured API backend in seconds.
112 lines (92 loc) • 2.74 kB
JavaScript
require("dotenv").config();
const path = require("path");
const Joi = require("joi");
const envVarsSchema = Joi.object()
.keys({
PORT: Joi.number(),
PING: Joi.string().optional(),
MONGODB_USERNAME: Joi.string(),
MONGODB_PASSWORD: Joi.string(),
MONGODB_URL: Joi.string(),
MONGODB_DATABASE: Joi.string(),
JWT_SECRET: Joi.string(),
JWT_ACCESS_EXPIRATION_MINUTES: Joi.number(),
JWT_REFRESH_EXPIRATION_MINUTES: Joi.number(),
SMTP_HOST: Joi.string(),
SMTP_PORT: Joi.number(),
SMTP_MAIL: Joi.string(),
SMTP_PASSWORD: Joi.string(),
EMAIL_FROM: Joi.string(),
API_KEY: Joi.string(),
AUTH_DOMAIN: Joi.string(),
DATABASE_URL: Joi.string(),
PROJECT_ID: Joi.string(),
STORAGE_BUCKET: Joi.string(),
MESSAGING_SENDER_ID: Joi.string(),
APP_ID: Joi.string(),
MEASUREMENT_ID: Joi.string(),
SOCKET_ORIGIN: Joi.string().optional(),
GOOGLE_CLIENT_ID: Joi.string(),
GOOGLE_CLIENT_SECRET: Joi.string(),
GOOGLE_CLIENT_URI: Joi.string(),
SERVER_ORIGIN: Joi.string(),
FRONTEND_ORIGIN: Joi.string()
})
.unknown();
const { value: envVars, error } = envVarsSchema
.prefs({ errors: { label: "key" } })
.validate(process.env);
if (error) {
throw new Error(`Config validation error: ${error.message}`);
}
module.exports = {
port: envVars.PORT,
env: envVars.NODE_ENV,
mongoose: {
username: envVars.MONGODB_USERNAME,
password: envVars.MONGODB_PASSWORD,
url: envVars.MONGODB_URL,
database: envVars.MONGODB_DATABASE
},
jwt: {
secret: envVars.JWT_SECRET,
accessExpirationMinutes: envVars.JWT_ACCESS_EXPIRATION_MINUTES,
refreshExpirationMinutes: envVars.JWT_REFRESH_EXPIRATION_MINUTES
},
email: {
smtp: {
host: envVars.SMTP_HOST,
port: envVars.SMTP_PORT,
auth: {
username: envVars.SMTP_MAIL,
password: envVars.SMTP_PASSWORD
}
},
from: envVars.EMAIL_FROM
},
firebase: {
apiKey: envVars.API_KEY,
authDomain: envVars.AUTH_DOMAIN,
databaseUrl: envVars.DATABASE_URL,
projectId: envVars.PROJECT_ID,
storageBucket: envVars.STORAGE_BUCKET,
messagingSenderId: envVars.MESSAGING_SENDER_ID,
appId: envVars.APP_ID,
measurementId: envVars.MEASUREMENT_ID
},
ping: {
url: envVars.PING_URL
},
socket: {
origin: envVars.SOCKET_ORIGIN
},
google: {
client_id: envVars.GOOGLE_CLIENT_ID,
client_secret: envVars.GOOGLE_CLIENT_SECRET,
client_uri: envVars.GOOGLE_CLIENT_URI
},
protocol: {
server_origin: envVars.SERVER_ORIGIN,
frontend_origin: envVars.FRONTEND_ORIGIN
}
};