UNPKG

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
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); }