In Node.js possiamo effettuare il logging degli errori su MongoDB.

Installiamo il driver per MongoDB:


npm install mongoose --save

Definiamo il seguente schema per i documenti della nostra collezione (ad esempio logs):


'use strict';

const mongoose  = require('mongoose');

const Schema  = mongoose.Schema;

const LogSchema = new Schema({
    time: Date,
    file: String,
    line: String,
    info: Mixed,
    type: String

},{collection: 'logs'});

module.exports = mongoose.model('logs', LogSchema);

Quindi possiamo creare la seguente funzione di utility che crea un nuovo documento nella nostra collezione di log.


'use strict';

const log = (data, logs) => {
    return new logs({
        time: new Date(),
        file: data.file,
        line: data.line,
        info: data.info,
        type: data.type
    }).save();
};

module.exports = log;

Questa semplice funzione registra la data in cui si verifica un errore, il nome del file, la riga in cui è stata invocata questa funzione, i dettagli dell'errore e la gravità dell'errore (per esempio critical).

Possiamo usare questa funzione ogni qualvolta dobbiamo gestire gli errori, ad esempio con le Promise e async/await.


'use strict';

const app = require('express')();
const users = require('./models/users');
const logs = require('./models/logs');
const log = require('./lib/log');

app.get('/users', async (req, res) => {
    try {
        const results = await users.find();
        res.send(results);
    } catch(err) {
        log({
            file: 'app.js',
            line: '10',
            info: err,
            type: 'critical'
        }, logs);
        res.sendStatus(500);
    }
});

La procedura mostrata sopra non opera come funzione middleware per un motivo ben preciso: effettuare il logging automatico su ogni richiesta significa effettuare una query al database su ogni endpoint della nostra applicazione, il che porta inevitabilmente ad un load eccessivo su MongoDB. Questa soluzione è pensata per endpoint specifici della nostra applicazione o delle nostre API.