node-prisma-structure
Version:
A Node.js API structure using Prisma ORM for scalable and modular development. This package includes a complete authentication API (signup, login, logout, password reset, and token-based authentication) and provides a well-organized directory structure fo
86 lines (73 loc) • 2.59 kB
JavaScript
require("dotenv").config();
const express = require('express');
const bodyParser = require('body-parser');
const compression = require('compression')
const cors = require('cors');
const { createDoc } = require('node-api-document');
const rateLimit = require('express-rate-limit');
const apiDoc = require('./node_prisma.api-doc');
const apiPath = require('./modules/v1/api');
const app = express();
const allowedReferrers = [
'http://localhost:3000',
];
app.use(cors({
origin: (origin, callback) => {
if (!origin || allowedReferrers.includes(origin)) {
callback(null, true);
} else {
console.error('CORS error: Origin not allowed:', origin); // Log the error for debugging
callback(new Error(`CORS error: Origin ${origin} is not allowed`));
}
},
methods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'],
credentials: true,
}));
app.use(compression());
app.use(rateLimit({
windowMs: 1 * 60 * 1000, // 1 minute
max: 80, // Limit each user to 80 requests per windowMs
keyGenerator: (req) => {
let token;
if (!req?.loginUser?.token) {
let tokenFetched = req.header('Authorization');
token = tokenFetched?.replace('Bearer ', '');
}
return req.headers['z-user-ip'] || req?.loginUser?.token || token || req.ip;
},
message: { code: 429, status: "error", message: "Too many requests, please try again later." },
standardHeaders: true,
legacyHeaders: false,
}));
app.use((err, req, res, next) => {
if (err instanceof Error && err.message.startsWith('CORS error')) {
res.status(403).json({ message: err.message });
} else {
next(err);
}
});
app.use(express.json());
app.use(express.text());
app.use(bodyParser.json({ limit: '35mb' }));
app.use(bodyParser.urlencoded({
extended: true,
limit: '35mb',
parameterLimit: 50000,
}));
app.engine('html', require('ejs').renderFile);
app.set('view engine', 'html');
app.use('/v1/', apiPath);
createDoc(app, 'api-key, token, accept-language, z-user-ip', apiDoc);
// 404 handler
app.use("*", (req, res) => {
res.status(404).json({ status: "error", message: '404 Not Found' });
});
const PORT = process.env.PORT || 3000;
try {
app.use(express.static('public'));
server = app.listen(PORT, () => {
console.log(`😈 Worker ${process.pid}\x1b[33m App Running \x1b[0m\x1b[37m\x1b[1m⚡\x1b[33mOn 🔥 \x1b[4m\x1b[36m\x1b[1m` + PORT + `\x1b[0m 🔥`);
});
} catch (error) {
console.log('error in server -==-=-=-=-- ', error);
}