
Research
/Security News
Critical Vulnerability in NestJS Devtools: Localhost RCE via Sandbox Escape
A flawed sandbox in @nestjs/devtools-integration lets attackers run code on your machine via CSRF, leading to full Remote Code Execution (RCE).
mongodb-api-router
Advanced tools
index.js
Benvenuti nella documentazione dettagliata di index.js, un modulo che fornisce una factory per creare middleware Express/Mongoose con supporto a CRUD, localizzazione, paginazione, filtri e molto altro! 🚀
apiRoute
parseFilter
skimming
& middleware
personalizzatires.sendMessage
acceptedQueryFields
pagesManager
)catchMongoDBError
GET
Questo file esporta:
BrowserLanguage
(Symbol)defineMessage
per aggiungere/override di messaggi multilinguaapiRoute(model, options)
che genera un middleware Express per esporre un’API RESTful completa (CRUD) su un modello Mongoose, con:
Modulo | Scopo |
---|---|
mongoose | Modellazione e query su MongoDB |
express | Creazione di middleware HTTP |
body-parser | Parsing del corpo delle request (JSON) |
colors | Colorazione dei log in console |
import mongoose from 'mongoose';
import express from 'express';
import bodyParser from 'body-parser';
import 'colors';
L’oggetto messages
definisce traduzioni per codici di errore numerici (1…11). È possibile aggiungere o sovrascrivere messaggi tramite defineMessage
.
Estratto per i primi codici:
const messages = {
__userMessages: {},
1: {
it: 'La richiesta non è valida.',
en: 'The request is invalid.',
es: 'La solicitud no es válida.',
// … altre lingue …
},
2: {
it: 'Non puoi filtrare i risultati con il parametro «{key}».',
en: 'You cannot filter results by the “{key}” parameter.',
// … altre lingue …
},
// … fino al codice 11 …
};
🔧 BrowserLanguage
Un Symbol('BrowserLanguage')
usato per distinguere tra lingua forzata e lingua determinata dalle preferenze del client.
✨ defineMessage(number, value)
Aggiunge o sovrascrive un messaggio utente:
number
(Number): codice del messaggiovalue
(Object): mappa lang → string
🔍 message(number, lang, replace = {})
Restituisce il messaggio localizzato, applicando i placeholder:
{key}
con replace[key]
// Esempio
defineMessage(12, { it: 'Utente non trovato.', en: 'User not found.' });
message(12, 'it'); // → 'Utente non trovato.'
apiRoute(model, options)
function apiRoute(model, options = {}) { /* ... */ }
export default apiRoute;
Genera un middleware asincrono per Express, che espone un endpoint CRUD sul model
Mongoose.
Parametro | Tipo | Default | Descrizione |
---|---|---|---|
model | mongoose.Model | REQUIRED | Modello su cui operare |
options | Object | {} | Configurazione (vedi sotto) |
Chiavi di options
:
Chiave | Tipo | Default | Descrizione |
---|---|---|---|
filter | Function | Function[] | [] | Funzioni di autorizzazione personalizzate |
methods | String[] | ['PUT','POST','GET','DELETE'] | Metodi HTTP consentiti |
route | String | '/api/{collectionName}' | URL dell’endpoint (supporta {modelName} e {collectionName} ) |
fields | Object | null | Mappatura campi per lingua e visibilità |
pagesManager | Object | null | { limit: '?limit', page: '?page', maxResults: Number } per paginazione |
acceptedQueryFields | String[] | Object | Tutti i campi dello schema | Campi ammessi per query su ciascun metodo |
throwRefusedQueryFields | Boolean | true | Se true , rifiuta richieste con campi query non consentiti (400) |
language | String | Symbol | Lingua browser | Forza una lingua specifica |
options (nested) | Object | {} | Configurazioni per metodo: skimming , middleware , fields |
filter
: deve essere funzione o array di funzioni, altrimenti lancia un Error
.methods
: array di stringhe, valide solo quelle in allowedMethods
.route
: se specificato, deve essere stringa e supportare i placeholder {modelName}
, {collectionName}
.if(route) {
route = route
.replaceAll('{modelName}', model.modelName)
.replaceAll('{collectionName}', model.collection.name);
} else {
route = '/api/' + model.collection.name;
}
Il middleware restituito gestisce tutte le fasi di una chiamata API:
const parseFilter = (object, fields) => {
// - Traduzione nomi campi (fields)
// - Rimozione campi non ammessi
// - Paginazione (pagesManager)
// - Errore 400 se throwRefusedQueryFields
};
object
(req.query o req.body), fields
(mappatura custom)acceptedQueryFields
limit
e page
se pagesManager
attivo{ document, req, res, next, query }
e può modificarliAggiunge al res
un metodo:
res.sendMessage = (number, replace) => {
const ok = res.statusCode >= 200 && res.statusCode < 300;
res.json({
ok,
status: res.statusCode,
[ ok ? 'message' : 'error' ]: message(number, lang, replace)
});
};
Usato per risposte rapide con solo ok
, status
e messaggio tradotto.
req.method
non è in methods
, passa il controllo con next()
req.path
non coincide con route
, passa con next()
Per ogni funzione in filter
, viene invocata con { req, res, next, query }
:
true
: approvatofalse
: 403 Forbidden con messaggio 11status
e JSONacceptedQueryFields
Trasforma acceptedQueryFields
in mappa per ogni metodo, quindi controlla req.query
(GET) o req.body
(POST/PUT/DELETE).
pagesManager
)Se attivo, interpreta parametri ?limit
e ?page
, applica:
skip((page-1)*limit).limit(limit)
maxResults
if(error.name === 'ValidationError') {
// Mappa gli errori Mongoose in array di
// { target: field, error: string }
// con messaggi tradotti (codici 3–10)
}
In caso di validazione, restituisce 400 Bad Request con lista di errori dettagliati.
Metodo | Azione |
---|---|
GET | - model.find(query) (con lean, sort e paginazione) - Skimming - Rinomina/nasconde campi - Risponde { ok: true, [collection]: Array } |
POST | - Nuovo documento new model(query) - Middleware - save() + catchMongoDBError - Skimming + rinomina - { ok: true, document } |
PUT | - findOneAndUpdate(query, set) - Recupera documento aggiornato - Skimming + rinomina - { ok: true, [modelName]: document } |
DELETE | - find() + (skimming → deleteOne per risultato) o deleteMany(query) - { ok: true } |
GET
sequenceDiagram
participant C as Client
participant E as Express-Router
participant M as apiRoute
participant DB as MongoDB
participant R as Response
C->>E: GET /api/collection?param=val
E->>M: middleware(req, res, next)
M->>M: parseFilter & check autorizzazioni
M->>DB: model.find(query).lean()
DB-->>M: results[]
M->>M: skimming + rinomina campi
M->>R: res.json({ ok: true, collection: results })
R-->>C: JSON
import express from 'express';
import apiRoute from './index.js';
import User from './models/User.js';
const app = express();
app.use(express.json());
app.use(
apiRoute(User, {
methods: ['GET','POST','PUT','DELETE'],
route: '/api/users',
acceptedQueryFields: ['name','email','age'],
throwRefusedQueryFields: true,
pagesManager: { limit: '?limit', page: '?page', maxResults: 100 },
fields: {
name: { it: 'nome', en: 'name' },
email: { it: 'email', en: 'email' }
},
filter: [
async ({ req }) => {
// Esempio di autorizzazione
return req.user?.isAdmin === true;
}
]
})
);
app.listen(3000, () => console.log('Server avviato 🚀'));
Codice HTTP | Body |
---|---|
200/201 | { ok: true, ... } (array o documento) |
400 | { ok: false, status: 400, errors: [ { target, error } ] } oppure < errors > per campi non ammessi |
403 | { ok: false, status: 403, error: string } |
Altro | Passa al next() per gestioni esterne (es. 404, 405, ecc.) |
export { BrowserLanguage, defineMessage };
export default apiRoute;
Symbol
per controllo lingua🎉 Fine della documentazione di index.js! Espero che questa guida vi aiuti a integrare in modo semplice e flessibile le vostre API Express/Mongoose. Buon coding! 👩💻👨💻
FAQs
MongoDB API Router
The npm package mongodb-api-router receives a total of 7 weekly downloads. As such, mongodb-api-router popularity was classified as not popular.
We found that mongodb-api-router demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 0 open source maintainers collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Research
/Security News
A flawed sandbox in @nestjs/devtools-integration lets attackers run code on your machine via CSRF, leading to full Remote Code Execution (RCE).
Product
Customize license detection with Socket’s new license overlays: gain control, reduce noise, and handle edge cases with precision.
Product
Socket now supports Rust and Cargo, offering package search for all users and experimental SBOM generation for enterprise projects.