节点排序(MSSQL)-用户“

时间:2019-04-04 19:15:15

标签: node.js sql-server sequelize.js tedious

关于这个问题,我遇到了好几篇文章,但是似乎都没有一个实际的答案。有几个想法,但没有一个起作用。

在研究了Sequelize和Tedious软件包并看完我的配置正确传递后,我很茫然。

我正在尝试针对MSSQL中的新数据库运行迁移。我可以用我在这里使用的相同凭据连接到它,所以我知道这不是问题。

我有config.js,它正在提取环境变量。除了我的自定义控制台语句外,该文件是从sequelize自动生成的,并在我的sequelizerc中正确引用了

require('dotenv').config()
console.log('[+] Loading database config...')

if (process.env.NODE_ENV === 'production') {
  console.log(`[+] Using database: ${process.env.PROD_DB_DATABASE}`)
} else if (process.env.NODE_ENV === 'development') {
  console.log(`[+] Using database: ${process.env.DEV_DB_DATABASE}`)
} else if (process.env.NODE_ENV === 'test') {
  console.log(`[+] Using database: ${process.env.TEST_DB_DATABASE}`)
} else if (process.env.NODE_ENV === 'local') {
  console.log(`[+] Using database: ${process.env.LOCAL_DB_DATABASE}`)
} else {
  console.log(`[-] CANNOT LOAD DATABASE FROM ENV: ${process.env.NODE_ENV}`)
  process.exit()
}

module.exports = {
  production: {
    database: process.env.PROD_DB_DATABASE,
    username: process.env.PROD_DB_USERNAME,
    password: process.env.PROD_DB_PASSWORD,
    host: process.env.PROD_DB_HOST,
    port: process.env.PROD_DB_PORT,
    dialect: process.env.PROD_DB_DIALECT,
    storage: process.env.PROD_DB_STORAGE,
    logging: false,
    dialectOptions: {
      instanceName: process.env.PROD_INSTANCE_NAME
    },
    pool: {
      min: 5,
      max: 1,
      acquire: 6000,
      idle: 6000
    }
  },
  development: {
    database: process.env.DEV_DB_DATABASE,
    username: process.env.DEV_DB_USERNAME,
    password: process.env.DEV_DB_PASSWORD,
    host: process.env.DEV_DB_HOST,
    port: process.env.DEV_DB_PORT,
    dialect: process.env.DEV_DB_DIALECT,
    storage: process.env.DEV_DB_STORAGE,
    logging: console.log,
    dialectOptions: {
      instanceName: process.env.DEV_INSTANCE_NAME,
      debug: true
    },
    pool: {
      min: 5,
      max: 1,
      acquire: 6000,
      idle: 6000
    }
  },
  test: {
    database: process.env.TEST_DB_DATABASE,
    username: process.env.TEST_DB_USERNAME,
    password: process.env.TEST_DB_PASSWORD,
    host: process.env.TEST_DB_HOST,
    port: process.env.TEST_DB_PORT,
    dialect: process.env.TEST_DB_DIALECT,
    storage: process.env.TEST_DB_STORAGE,
    logging: false
  },
  local: {
    database: process.env.LOCAL_DB_DATABASE,
    username: process.env.LOCAL_DB_USERNAME,
    password: process.env.LOCAL_DB_PASSWORD,
    host: process.env.LOCAL_DB_HOST,
    port: process.env.LOCAL_DB_PORT,
    dialect: process.env.LOCAL_DB_DIALECT,
    storage: process.env.LOCAL_DB_STORAGE,
    logging: false
  }
}

运行迁移时出现错误:

> node_modules/.bin/sequelize db:migrate

// ERROR: Login failed for user ''.

如上所述,我研究了序列化和繁琐的操作,并且我的配置正确地通过了两者,因此我知道这不是环境变量问题还是NODE_ENV问题。

有人在这里有什么想法吗?我要把脸砸到键盘上。

3 个答案:

答案 0 :(得分:0)

您正在使用哪个版本的Sequelize?如果是v5, 根据{{​​3}}:

  

Sequelize现在可用于繁琐的> = 6.0.0

但是,在其package.json中,它完全不依赖于tedious。 由于您的程序仍在运行,我猜您之前手动安装了旧版本的tedious,所以导致了这个奇怪的问题。

手动安装tedious版本> = 6应该可以解决此问题,就像其Sequelize v5's document中所述:

  

您还必须为您选择的数据库手动安装驱动程序:
  # One of the following: $ npm install --save pg pg-hstore # Postgres $ npm install --save mysql2 $ npm install --save mariadb $ npm install --save sqlite3 $ npm install --save tedious # Microsoft SQL Server

答案 1 :(得分:0)

const Sequelize = require('sequelize');

const sequelize = new Sequelize(
  process.env.DB_NAME, process.env.DB_USER, process.env.DB_PASS, {
    dialect: 'mssql',
    host: process.env.DB_HOST, //This is an IP
    dialectOptions: {
      options: {
        instanceName: process.env.DB_INSTANCE_NAME,
        trustServerCertificate: true
      }, 
    }
  }
);
module.exports = {
  sequelize,
  Sequelize
}; 

这是另一种解决方案,对我有用。

答案 2 :(得分:0)

我遇到了同样的错误。原因是由于在sequelize配置文件中明确提到了数据库的名称,并且该名称不存在。原因可能与您的情况不同,但是快速查看SQL Server错误日志将为您提供失败的原因。

Login failed for user 'user'. Reason: Failed to open the explicitly specified database 'dbo'. [CLIENT: XX.XX.XX.XX]