NodeJS / Sequelize / MySQL – 为什么需要postgres依赖关系?

我是Node和Sequelize的新手,我正在build立与MySQL数据库的连接。 我想知道为什么Postgres依赖关系是需要的,即使将方言设置为mysql。 如能帮助我指出问题,我将不胜感激。

来自packages.json

"dependencies": { // ... "mysql2": "1.1.2", "sequelize": "3.27.0" }, 

我试图连接数据库的方式:

 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命令)

models / 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; 

和我的config / config.json

 { "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'.) 

但是,我已经安装到node_modules目录的根目录。


更新3

我采取的步骤来重现问题:

  • create-react-app tmpApp
  • npm install --save mysql sequelize
  • npm install -g sequelize-cli
  • sequelize init
  • 添加到src/index.jsvar models = require('../models')
  • npm start – 问题出现

更新4 – 问题已解决

首先非常感谢您的帮助! 这个问题实际上是因为我试图将服务器端和客户端混合到一个应用程序中(我只是在玩)。 Sequelize和mysql模块本身似乎不适用于浏览器环境。 当服务器端放在react-app之外时,所有的行为都像预期的那样。

在你的数据库configuration中,你必须把configuration设置为别的东西来使用。

  1. 使用sequelize检查env。 通常,它是数据库目录中的一个config.json文件。
  2. 改变方言为mysql2,因为这就是你想要使用的。

要解决你的问题吗:

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

这将让你的代码工作。 从我看到的官方文档,他们似乎也支持mysql2,但它不工作。 正如我testing并得到类似的结果。 我会build议在他们的github中提出一个问题,以便他们能够修复它们。 你可以在这里这样做