Impedire a Sequelize di inviare SQL alla console durante l'esecuzione della query?


188

Ho una funzione per recuperare il profilo di un utente.

app.get('/api/user/profile', function (request, response)
{
  // Create the default error container
  var error = new Error();

  var User = db.User;
  User.find({
    where: { emailAddress: request.user.username}
  }).then(function(user)
  {
    if(!user)
    {
      error.status = 500; error.message = "ERROR_INVALID_USER"; error.code = 301;
      return next(error);
    }

    // Build the profile from the user object
    profile = {
      "firstName": user.firstName,
      "lastName": user.lastName,
      "emailAddress": user.emailAddress
    }
    response.status(200).send(profile);
  });
});

Quando viene chiamata la funzione "trova", visualizza l'istruzione select sulla console in cui è stato avviato il server.

Executing (default): SELECT `id`, `firstName`, `lastName`, `emailAddress`, `password`, `passwordRecoveryToken`, `passwordRecoveryTokenExpire`, `createdAt`, `updatedAt` FROM `Users` AS `User` WHERE `User`.`emailAddress` = 'johndoe@doe.com' LIMIT 1;

C'è un modo per evitare che questo venga visualizzato? Qualche flag che ho impostato in un file di configurazione da qualche parte?


Ho una domanda, supponiamo che non voglia restituire il campo password nel metodo findOrCreate (). Come posso fare questo ?
Sunil Sharma,

@SunilSharma esclude l'attributo, cerca excludein questa pagina sequelize.readthedocs.io/en/latest/docs/querying/#attributes
Karel Frajták

Risposte:


359

Quando si crea l'oggetto Sequelize, passare falseal loggingparametro:

var sequelize = new Sequelize('database', 'username', 'password', {

  // disable logging; default: console.log
  logging: false

});

Per ulteriori opzioni, controlla i documenti .


23
è meglio iniziare una nuova domanda piuttosto che provare a trasferire una nuova domanda su una appena correlata.
thenetimp

Grazie, questo funziona ma dà uno spazio bianco per ogni query eseguita. Potete per favore aiutarmi ..
Tijo Tom

1
Per ora, l' loggingopzione dovrebbe essere una funzione .
Lee Han Kyeol,

1
Questo non sembra avere alcun effetto quando si utilizza sequelize v4. Qualcuno ha trovato una risoluzione?
Garbit,

37

Se si utilizza il file 'config / config.json', aggiungere 'logging': false in config.json in questo caso nella sezione di configurazione dello sviluppo.

  // file config/config.json
  {
      {
      "development": {
        "username": "username",
        "password": "password",
        "database": "db_name",
        "host": "127.0.0.1",
        "dialect": "mysql",
        "logging": false
      },
      "test": {
    ...
   }

27

Come in altre risposte, puoi semplicemente impostare logging:false, ma penso che, piuttosto che disabilitare completamente la registrazione, puoi semplicemente abbracciare i livelli di registro nella tua app. A volte potresti voler dare un'occhiata alle query eseguite, quindi potrebbe essere meglio configurare Sequelize per accedere a livello dettagliato o debug. ad esempio (sto usando Winston qui come framework di registrazione ma è possibile utilizzare qualsiasi altro framework):

var sequelize = new Sequelize('database', 'username', 'password', {
  logging: winston.debug
});

Ciò genererà istruzioni SQL solo se il livello di log di Winston è impostato su debug o su livelli di debug inferiori. Se il livello di registro è avvisato o le informazioni, ad esempio, SQL non verranno registrate


6

Tutte queste risposte sono disattivati la registrazione al momento della creazione.

E se fosse necessario disattivare la registrazione in fase di esecuzione?

Per runtime intendo dopo aver inizializzato l' sequelizeoggetto usando la new Sequelize(..funzione.

Ho dato un'occhiata alla fonte di github , ho trovato un modo per disattivare la registrazione in fase di esecuzione.

// Somewhere your code, turn off the logging
sequelize.options.logging = false

// Somewhere your code, turn on the logging
sequelize.options.logging = true 

2

Sulla base di questa discussione, ho creato questo config.jsonche funziona perfettamente:

{
  "development": {
    "username": "root",
    "password": null,
    "logging" : false,
    "database": "posts_db_dev",
    "host": "127.0.0.1",
    "dialect": "mysql",
    "operatorsAliases": false 
  }
}

2

Ecco la mia risposta:

Breve : stavo usando typeormcome libreria ORM. Quindi, per impostare il livello di registrazione delle query ho usato la seguente opzione invece di impostare direttamente l'opzione di registrazione come false.

Soluzione: nome del file - ormconfig.ts

{
    'type': process.env.DB_DRIVER,
    'host': process.env.DB_HOST,
    'port': process.env.DB_PORT,
    'username': process.env.DB_USER,
    'password': process.env.DB_PASS,
    'database': process.env.DB_NAME,
    'migrations': [process.env.MIGRATIONS_ENTITIES],
    'synchronize': false,
    'logging': process.env.DB_QUERY_LEVEL,
    'entities': [
        process.env.ORM_ENTITIES
    ],
    'cli': {
        'migrationsDir': 'migrations'
     }
}

E, nella variabile envrionment, impostare DB_QUERY_LEVELas ["query", "error"].

Risultato: di conseguenza registrerà solo quando la query presenta un errore, altrimenti non lo farà.

Collegamento di riferimento: digitare doc doc. Db registrazione log

Spero che questo ti aiuti! Grazie.


0

Sto usando Sequelize ORM 6.0.0 e sto usando "logging": false come il resto, ma ho pubblicato la mia risposta per l'ultima versione di ORM.

const sequelize = new Sequelize(
        process.env.databaseName,
        process.env.databaseUser,
        process.env.password,
        {
            host: process.env.databaseHost,
            dialect: process.env.dialect,
            "logging": false,
            define: {
                // Table names won't be pluralized.
                freezeTableName: true,
                // All tables won't have "createdAt" and "updatedAt" Auto fields.
                timestamps: false
            }
        }
    );

Nota: sto memorizzando i miei segreti in un file di configurazione .envosservando la metodologia a 12 fattori.


0

Ho risolto molti problemi utilizzando il seguente codice. I problemi erano: -

  1. Non connesso al database
  2. Problemi di rifiuto della connessione al database
  3. Sbarazzarsi dei registri nella console (specifico per questo).
const sequelize = new Sequelize("test", "root", "root", {
  host: "127.0.0.1",
  dialect: "mysql",
  port: "8889",
  connectionLimit: 10,
  socketPath: "/Applications/MAMP/tmp/mysql/mysql.sock",
  // It will disable logging
  logging: false
});

le persone usano ancora MAMP?
thenetimp

Sì, per lo sviluppo, se hai un'altra migliore opzione gratuita, per favore fatemelo sapere, grazie
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.