NodeJS/Sequelize/MySQL-为什么需要postgres依赖项?

NodeJS/Sequelize/MySQL-为什么需要postgres依赖项?,mysql,node.js,postgresql,sequelize.js,Mysql,Node.js,Postgresql,Sequelize.js,我不熟悉Node和Sequelize,我在建立到MySQL数据库的连接时遇到了一个问题。我想知道为什么即使将方言设置为mysql,也需要Postgres依赖项。如果你能帮我指出这个问题,我将不胜感激 来自packages.json "dependencies": { // ... "mysql2": "1.1.2", "sequelize": "3.27.0" }, 我尝试连接db的方式: var Sequelize = require('sequelize'); v

我不熟悉Node和Sequelize,我在建立到MySQL数据库的连接时遇到了一个问题。我想知道为什么即使将方言设置为mysql,也需要Postgres依赖项。如果你能帮我指出这个问题,我将不胜感激

来自packages.json

"dependencies": {
    // ...
    "mysql2": "1.1.2",
    "sequelize": "3.27.0"
},
我尝试连接db的方式:

var Sequelize = require('sequelize');

var sequelize = new Sequelize('dbName', 'dbUser', 'dbPass', {
    host: 'localhost',
    dialect: 'mysql'
});

sequelize.authenticate()
    .then(function(err) {
        console.log('Connection has been established successfully.');
    })
    .catch(function (err) {
        console.log('Unable to connect to the database:', err);
    });
我面临的错误是:

Failed to compile.

Error in ./~/sequelize/lib/dialects/postgres/hstore.js
Module not found: 'pg-hstore' in ~/node_modules/sequelize/lib/dialects/postgres
@ ./~/sequelize/lib/dialects/postgres/hstore.js 3:13-33

更新1
使用了sequelize init
命令)

模型/index.js

'use strict';

var fs        = require('fs');
var path      = require('path');
var Sequelize = require('sequelize');
var basename  = path.basename(module.filename);
var env       = 'development'; //process.env.NODE_ENV || 'development';
var config    = require(__dirname + '/../config/config.json')[env];
var db        = {};

if (config.use_env_variable) {
  var sequelize = new Sequelize(process.env[config.use_env_variable]);
} else {
  var sequelize = new Sequelize(config.database, config.username, config.password, config);
}

fs
  .readdirSync(__dirname)
  .filter(function(file) {
    return (file.indexOf('.') !== 0) && (file !== basename) && (file.slice(-3) === '.js');
  })
  .forEach(function(file) {
    var model = sequelize['import'](path.join(__dirname, file));
    db[model.name] = model;
  });

Object.keys(db).forEach(function(modelName) {
  if (db[modelName].associate) {
    db[modelName].associate(db);
  }
});

db.sequelize = sequelize;
db.Sequelize = Sequelize;

module.exports = db;
{
  "development": {
    "username": "dbUser",
    "password": "dbPassword",
    "database": "dbName",
    "host": "127.0.0.1",
    "dialect": "mysql2"
  },
  "test": {
    "username": "root",
    "password": null,
    "database": "database_test",
    "host": "127.0.0.1",
    "dialect": "mysql2"
  },
  "production": {
    "username": "root",
    "password": null,
    "database": "database_production",
    "host": "127.0.0.1",
    "dialect": "mysql2"
  }
}
我的config/config.json

'use strict';

var fs        = require('fs');
var path      = require('path');
var Sequelize = require('sequelize');
var basename  = path.basename(module.filename);
var env       = 'development'; //process.env.NODE_ENV || 'development';
var config    = require(__dirname + '/../config/config.json')[env];
var db        = {};

if (config.use_env_variable) {
  var sequelize = new Sequelize(process.env[config.use_env_variable]);
} else {
  var sequelize = new Sequelize(config.database, config.username, config.password, config);
}

fs
  .readdirSync(__dirname)
  .filter(function(file) {
    return (file.indexOf('.') !== 0) && (file !== basename) && (file.slice(-3) === '.js');
  })
  .forEach(function(file) {
    var model = sequelize['import'](path.join(__dirname, file));
    db[model.name] = model;
  });

Object.keys(db).forEach(function(modelName) {
  if (db[modelName].associate) {
    db[modelName].associate(db);
  }
});

db.sequelize = sequelize;
db.Sequelize = Sequelize;

module.exports = db;
{
  "development": {
    "username": "dbUser",
    "password": "dbPassword",
    "database": "dbName",
    "host": "127.0.0.1",
    "dialect": "mysql2"
  },
  "test": {
    "username": "root",
    "password": null,
    "database": "database_test",
    "host": "127.0.0.1",
    "dialect": "mysql2"
  },
  "production": {
    "username": "root",
    "password": null,
    "database": "database_production",
    "host": "127.0.0.1",
    "dialect": "mysql2"
  }
}

更新2

现在我看到了另外一条信息:

Error: The dialect mysql is not supported. (Error: Cannot find module './mysql'.)
但是,我已经将它安装到
节点\u modules
目录的根目录中


更新3

我为重现问题而采取的步骤:

  • create react app tmpApp
  • npm安装--保存mysql续集
  • npm安装-g sequelize cli
  • sequelize init
  • 添加到
    src/index.js
    var models=require('../models')
  • npm启动
    -出现问题

更新4-问题已解决


首先非常感谢你的帮助!这个问题实际上是因为我试图将服务器端和客户端混合到一个应用程序中(我只是在玩)。Sequelize和mysql模块本身似乎无法在浏览器环境中工作。当服务器端位于react应用程序外部时,一切都会按预期运行。

在数据库配置中,必须将配置设置为其他要使用的配置

  • 使用sequelize检查环境。通常,它是数据库目录中的config.json文件
  • 将方言更改为mysql2,因为这是您想要使用的

  • 要解决您的问题,请执行以下操作:

    `npm install mysql ---save` instead of `mysql2`
    

    这将使您的代码正常工作。从我在官方文档中看到的情况来看,他们似乎也支持mysql2,但它不起作用。正如我所做的测试,得到了类似的结果。我建议在他们的github中提出一个问题,这样他们就可以自己解决它了。您可以这样做

    您不需要postgres模块。请确保您使用的是
    mysql2
    方言,而不是
    mysql
    ,因为您使用的是
    mysql2
    接口。在
    models/index.js
    @AJS中执行
    console.log(config)
    时,您得到的值是多少,
    config.use_env_变量
    未定义,这对我来说似乎是合理的,因为我不想使用来自环境变量的配置,而是来自
    config.json
    。我说的对吗?是的,它是关于配置变量的,它的输出是什么我更新了我的问题我的项目很空,所以我刚刚使用了sequelize cli init命令,然后修改了
    config/config.json
    。现在我还使用了
    models/index.js
    中的sequelize实例,但问题仍然存在。方言当然更改为
    mysql2
    。显示您的
    models/index.js
    默认情况下,它应该使用
    config.json
    中的开发配置,否则默认使用postgres。@Anirudha如果您更改为方言
    mysql2
    ,它将给您以下错误:支持的方言:mariadb、mssql、mysql、postgres,和sqlite。您需要安装这些依赖项
    npm安装——保存mysql
    @Anirudha,实际上我有它。事实上,我已经发现了这个问题——请看一下我更新的问题。不幸的是,我已经尝试了这两个问题,结果是相同的:
    Error:方言mysql不受支持。(错误:找不到模块“/mysql”)
    。或
    错误:不支持方言mysql2。(错误:找不到模块“./mysql2”)
    当然我已经安装了它们。当我尝试时,它起作用了。为什么不同时删除这两个模块,然后再次安装
    mysql
    ,你可以通过
    npm卸载来做到这一点——保存
    将方言设置为
    mysql
    而不是
    mysql2
    方言设置为
    mysql
    和npm软件包:
    “mysql”:“2.12.0”
    “sequelize”:“2.0.0”
    。问题仍然存在。您的代码是否准确地显示在您创建连接的帖子?即文件中?