Node.js 防止Sequelize在执行查询时将SQL输出到控制台?

Node.js 防止Sequelize在执行查询时将SQL输出到控制台?,node.js,sequelize.js,Node.js,Sequelize.js,我有一个函数来检索用户的配置文件 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(

我有一个函数来检索用户的配置文件

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);
  });
});
调用“find”函数时,它会在启动服务器的控制台上显示select语句

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

有没有办法让它不被显示?我在某个配置文件中设置的某个标志?

当您创建Sequelize对象时,将
false
传递给
日志记录
参数:

var sequelize = new Sequelize('database', 'username', 'password', {
  
  // disable logging; default: console.log
  logging: false

});

有关更多选项,请检查。

如果使用了'config/config.json'文件,则在“开发配置”部分的config.json中添加'logging':false

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

与其他答案一样,您可以只设置
日志记录:false
,但我认为,与完全禁用日志记录相比,您可以在应用程序中使用日志记录级别。有时,您可能希望查看已执行的查询,因此最好将Sequelize配置为详细或调试级别的日志。例如(我在这里使用winston作为日志框架,但您可以使用任何其他框架):


仅当winston log level设置为debug或更低的调试级别时,才会输出SQL语句。如果日志级别为warn或info,例如SQL将不会被记录

基于此讨论,我构建了此
config.json
,可以完美地工作:

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

我使用的是Sequelize ORM 6.0.0,我使用的是“日志记录”:与其他版本一样错误,但我发布了最新版本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
            }
        }
    );

注意:我正在将我的秘密存储在一个配置文件
.env
中,遵守12因素方法。

所有这些答案在创建时都会关闭日志记录

但是,如果我们需要关闭运行时的日志记录,该怎么办

所谓运行时,我的意思是在使用
newsequelize(..
函数初始化
sequelize
对象之后

我浏览了一下,找到了一种在运行时关闭日志记录的方法

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

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

我使用下面的代码解决了很多问题。 问题是:

  • 未连接到数据库
  • 数据库连接拒绝问题
  • 清除控制台中的日志(特定于此)
  • 以下是我的答案:

    Brief:我使用
    typeorm
    作为ORM库。因此,为了设置查询日志记录级别,我使用了以下选项,而不是直接将日志记录选项设置为
    false

    解决方案:文件名-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'
         }
    }
    
    并且,在环境变量中,将
    DB\u QUERY\u LEVEL
    设置为[“QUERY”,“error”]

    结果:因此,只有当查询有错误时才会记录,否则不会记录

    参考链接:

    希望这有帮助! 谢谢。

    新的续集({
    主机:“本地主机”,
    数据库:“数据库名称”,
    方言:“mysql”,
    用户名:“root”,
    密码:“密码”,
    日志记录:false//用于禁用日志
    })
    
    我有一个问题,假设我不希望在findOrCreate()中返回密码字段方法。我该怎么做?@SunilSharma排除属性,在此页面上搜索
    exclude
    。你最好开始一个新问题,而不是尝试将一个新问题背在一个几乎不相关的问题上。谢谢,这是可行的,但它为执行的每个查询提供了一个空白。你能帮我吗..现在,
    日志记录
    选项应该是。这在使用sequelize v4时似乎没有效果。有人找到解决方案吗?人们仍然使用MAMP?是的,为了开发,如果您有其他最佳免费选项,请让我知道,谢谢
    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
    });
    
    {
        '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'
         }
    }