2016-11-25 120 views
1

我是Node和Sequelize的新手,我正在建立與MySQL數據庫的連接時遇到問題。我想知道爲什麼需要Postgres依賴關係,即使將方言設置爲mysql。如果您能幫助我指出問題,我將不勝感激。NodeJS/Sequelize/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命令)

模型/ 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.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" 
    } 
} 


UPDATE 2

現在我看到我有一個額外的消息:

Error: The dialect mysql is not supported. (Error: Cannot find module './mysql'.) 

不過,我把它安裝到node_modules目錄的根目錄。


UPDATE 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 - 這個問題似乎


UPDATE 4 - 問題解決

首先感謝真的爲您的幫助!實際發生這個問題是因爲我試圖將服務器端和客戶端混合到一個應用程序中(我只是在玩)。 Sequelize和mysql模塊本身似乎不適用於瀏覽器環境。當服務器端放置在react-app之外時,所有的行爲都像預期的那樣。

+0

你不應該需要postgres模塊。由於您使用的是「mysql2」接口,因此請確保您使用的是「mysql2」方言,而不是「mysql」。 – user3254198

+0

當你在'models/index.js'中做'console.log(config)'時,你得到的值是多少? – AJS

+0

@AJS,'config.use_env_variable'是不確定的,對我來說似乎是合理的,因爲我不喜歡不想使用來自環境變量但來自'config.json'的配置。我對嗎? – Mat

回答

1

在您的數據庫配置中,您必須將配置設置爲其他要使用的配置。

  1. 使用sequelize檢查env。通常,它是數據庫目錄中的config.json文件。
  2. 改變方言爲mysql2,因爲這就是你想要使用的。
+0

我的項目非常空,所以我剛剛使用sequelize-cli init命令並修改了'config/config.json'。現在我也使用'models/index.js'中的sequelize實例,但問題仍然存在。方言當然改爲'mysql2'。 – Mat

+0

顯示你的'models/index.js'它應該默認使用'config.json'中的開發配置,否則默認使用postgres。 – Anistark

+0

我已更新我的帖子並顯示這些文件。 – Mat

0

解決你的問題做:

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

,將讓你的代碼工作。從我看到的官方文檔here他們似乎也支持mysql2,但它不起作用。正如我測試並得到類似的結果。我會建議在他們的github中提出一個問題,以便他們可以修復它們。你可以這樣做here

+0

不幸的是,我已經試過它們兩個,結果相同: '錯誤:方言mysql不支持。 (錯誤:找不到模塊'./mysql'。)'。 或 '錯誤:方言mysql2不支持。 (錯誤:找不到模塊'./mysql2'。)' 當然,我安裝了它們。 – Mat

+0

它工作時,我試了它爲什麼不刪除兩個,只是再次安裝'mysql',你可以這樣做'npm卸載 --save' – AJS

+0

保留方言作爲'mysql'不'mysql2' – AJS