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

Posted

技术标签:

【中文标题】NodeJS/Sequelize/MySQL - 为啥需要 postgres 依赖项?【英文标题】:NodeJS/Sequelize/MySQL - Why postgres dependencies are needed?NodeJS/Sequelize/MySQL - 为什么需要 postgres 依赖项? 【发布时间】:2017-04-09 14:42:37 【问题描述】:

我是 Node 和 Sequelize 的新手,在建立与 mysql 数据库的连接时遇到问题。我想知道为什么即使将方言设置为 mysql 也需要 Postgres 依赖项。如果您能帮我指出问题,我将不胜感激。

来自 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 之外时,一切都按预期运行。

【问题讨论】:

您不需要 postgres 模块。确保您使用的是mysql2 方言,而不是mysql,因为您使用的是mysql2 接口。 models/index.js 中执行console.log(config) 得到的价值是多少 @AJS,config.use_env_variable 未定义,这对我来说似乎是合理的,因为我不想使用从环境变量而是从 config.json 获取的配置。我说的对吗? 是的,配置变量的输出是什么 我已经更新了我的问题 【参考方案1】:

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

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

【讨论】:

我的项目很空,所以我只使用了 sequelize-cli init 命令并修改了config/config.json。现在我也使用models/index.js 的sequelize 实例,但问题依然存在。方言当然改成mysql2 显示你的models/index.js 它应该默认使用来自config.json 的开发配置,否则默认使用postgres。 @Anirudha 如果您更改为方言mysql2,它将给您以下错误:支持的方言:mariadb、mssql、mysql、postgres 和 sqlite。 @Mat 你需要安装这些依赖。 npm install --save mysql @Anirudha,其实我有。事实上,我已经找到了问题 - 请查看我更新的问题。【参考方案2】:

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

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

这将使您的代码正常工作。从我在官方文档here 中看到的内容来看,它们似乎也支持 mysql2,但它不起作用。正如我已经测试并得到了类似的结果。我会建议在他们的 github 中提出一个问题,以便他们可以修复它。你可以这样做here

【讨论】:

不幸的是,我已经尝试了这两种方法,结果相同:Error: The dialect mysql is not supported. (Error: Cannot find module './mysql'.)。或Error: The dialect mysql2 is not supported. (Error: Cannot find module './mysql2'.) 当然我已经安装了。 当我尝试它时它工作了为什么不将两者都删除并重新安装mysql,你可以通过npm uninstall <module_name> --save这样做 保持方言为mysql 而不是mysql2 方言设置为 mysql 和 npm 包:"mysql": "2.12.0""sequelize": "2.0.0"。但问题仍然存在。 您的代码是否准确地显示在您的帖子中? IE。您在哪里创建连接的文件?

以上是关于NodeJS/Sequelize/MySQL - 为啥需要 postgres 依赖项?的主要内容,如果未能解决你的问题,请参考以下文章