Empêcher Sequelize de générer SQL sur la console lors de l'exécution de la requête?


197

J'ai une fonction pour récupérer le profil d'un utilisateur.

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

Lorsque la fonction "find" est appelée, elle affiche l'instruction select sur la console où le serveur a été démarré.

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

Existe-t-il un moyen de ne pas afficher cela? Un drapeau que j'ai défini dans un fichier de configuration quelque part?


J'ai une question, supposons que je ne veux pas que le champ de mot de passe soit renvoyé dans la méthode findOrCreate (). Comment puis-je faire ceci ?
Sunil Sharma du

@SunilSharma exclure l'attribut, recherchez excludesur cette page sequelize.readthedocs.io/en/latest/docs/querying/#attributes
Karel Frajták

Réponses:


381

Lorsque vous créez votre objet Sequelize, passez falseau loggingparamètre:

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

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

});

Pour plus d'options, consultez la documentation .


23
il vaut mieux commencer une nouvelle question que d'essayer de superposer une nouvelle question à une question à peine liée.
thenetimp

Merci, cela fonctionne mais cela donne un espace blanc pour chaque requête exécutée. Pouvez-vous s'il vous plaît m'aider ..
Tijo Tom

1
Pour l'instant, l' loggingoption devrait être une fonction .
Lee Han Kyeol

1
Cela ne semble pas avoir d'effet lors de l'utilisation de sequelize v4. Quelqu'un a trouvé une résolution?
Garbit

39

Si le fichier 'config / config.json' est utilisé, ajoutez 'logging': false au config.json dans ce cas dans la section de configuration de développement.

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

30

Comme dans d'autres réponses, vous pouvez simplement définir logging:false, mais je pense que mieux que de désactiver complètement la journalisation, vous pouvez simplement adopter les niveaux de journalisation dans votre application. Parfois, vous voudrez peut-être jeter un coup d'œil aux requêtes exécutées, il peut donc être préférable de configurer Sequelize pour se connecter au niveau détaillé ou déboguer. par exemple (j'utilise winston ici comme cadre de journalisation mais vous pouvez utiliser n'importe quel autre cadre):

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

Cela ne produira des instructions SQL que si le niveau de journal de winston est défini sur débogage ou des niveaux de débogage inférieurs. Si le niveau de journal est averti ou si les informations, par exemple, SQL ne seront pas enregistrées


8

Toutes ces réponses sont désactivées la journalisation au moment de la création.

Mais que se passe-t-il si nous devons désactiver la journalisation à l'exécution?

Par runtime, je veux dire après l'initialisation de l' sequelizeobjet en utilisant la new Sequelize(..fonction.

J'ai jeté un coup d'œil dans la source github , j'ai trouvé un moyen de désactiver la connexion au runtime.

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

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

2

Sur la base de cette discussion, j'ai construit ceci config.jsonqui fonctionne parfaitement:

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

2

Voici ma réponse:

Bref : J'utilisais typeormcomme bibliothèque ORM. Ainsi, pour définir le niveau de journalisation des requêtes, j'ai utilisé l'option suivante au lieu de définir directement l'option de journalisation comme false.

Solution: nom de fichier - 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'
     }
}

Et, dans la variable d'environnement, définissez DB_QUERY_LEVELcomme ["requête", "erreur"].

Résultat: en conséquence, il n'enregistrera que lorsque la requête contient une erreur, sinon ce ne sera pas le cas.

Lien de référence: document de journalisation des requêtes de typeorm db

J'espère que cela t'aides! Merci.


0

J'utilise Sequelize ORM 6.0.0 et j'utilise "logging": false comme le reste mais j'ai posté ma réponse pour la dernière version de l'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
            }
        }
    );

Remarque: je stocke mes secrets dans un fichier de configuration en .envrespectant la méthodologie à 12 facteurs.


0

J'ai résolu de nombreux problèmes en utilisant le code suivant. Les problèmes étaient: -

  1. Ne pas se connecter à la base de données
  2. Problèmes de rejet de connexion à la base de données
  3. Se débarrasser des journaux dans la console (spécifique pour cela).
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
});

les gens utilisent encore MAMP?
thenetimp

Oui, pour le développement, si vous avez une autre meilleure option gratuite, veuillez me le faire savoir, merci
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.