2016-11-25 3 views
1

Я новичок в Node и Sequelize, и у меня возникла проблема с установлением соединения с базой данных MySQL. Интересно, почему нужны зависимости Postgres, даже если установить диалект на mysql one. Буду признателен, если вы поможете мне указать на проблему.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.js: var models = require('../models')
  • npm start - проблема появляется


UPDATE 4 - Проблема решена

Прежде всего действительно спасибо за вашу помощь! Проблема на самом деле произошла, потому что я пытался смешивать сервер и клиентские стороны в одном приложении (я просто играл). Модули Sequelize и mysql, похоже, не работают в среде браузера. Когда серверная сторона помещена вне реагирующего приложения, все ведет себя так, как ожидалось.

+0

Вам не нужен модуль postgres. Убедитесь, что вы используете диалоги 'mysql2', хотя и не' mysql', так как вы используете интерфейс 'mysql2'. – user3254198

+0

Какое значение вы получаете, когда выполняете 'console.log (config)' in 'models/index.js' – AJS

+0

@AJS,' config.use_env_variable' не определен, что кажется мне разумным, так как я Не хотите использовать конфигурацию, взятую из переменной окружения, но из 'config.json'. Я прав? – Mat

ответ

1

В вашей конфигурации базы данных вы должны установить конфигурацию как что-то еще, что нужно использовать.

  1. Проверьте env, используя sequelize. Обычно это файл config.json внутри вашего каталога базы данных.
  2. Измените диалект на mysql2, так как это то, что вы хотите использовать.
+0

Мой проект был довольно пустым, поэтому я только что использовал команду initelize-cli init и изменил конфигурацию 'config/config.json'. Теперь я также использую экземпляр sequelize из 'models/index.js', но проблема остается. Диалект, конечно, изменен на '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 uninstall --save' – AJS

+0

сохранить диалект как 'mysql' не' mysql2' – AJS