17/3/2024
В интернете много статей, как развернуть и настроить react (фронт) + node.js (бэкенд) локально у себя на компьютере. И вот вы все дописали, протестировали, осталось это разместить доступно для всех. Выбираете хостинг, читаете порядок развертывания приложения. И упс! что-то не заработало.
Причин обычно несколько, поэтому начнем по порядку. Рассмотрим проблемы с подключением к базам данных, через sequelize. И получением/записью данных в базу на хостинге.
Ошибка цикличности.
Как оказалось я два раза определил базу данных в разных модулях. Забыл и запутался, но localhost server даже не ругнулся. Пришлось изменить немного код и проблема ушла. Итак, как лучше делать.
В файле dbdata.js определить параметры для подключения с учетом продакшена:
require('dotenv').config();
let DB_NAME, USER_NAME,PASSWORD,HOSTNAME
if(process.env.NODE_ENV==='development'){
DB_NAME='testblog';
USER_NAME='mysql';
PASSWORD='mysql';
HOSTNAME='localhost';
}else{
DB_NAME=process.env.DB_NAME;
USER_NAME=process.env.USER_NAME;
PASSWORD=process.env.PASSWORD;
HOSTNAME=process.env.HOSTNAME;
}
/*
const sequelize=new Sequelize(DB_NAME,USER_NAME,PASSWORD,{
host:HOSTNAME,
dialect:'mysql'
});
module.exports = {
HOST: 'localhost',
USER: USER_NAME,
PASSWORD: PASSWORD,
DB: DB_NAME,
dialect: "mysql",
pool: {
max: 5,
min: 0,
acquire: 30000,
idle: 10000
}Затем в папке моделей (например, models) создать подключение (например,index.js):
const dbConfig = require("./dbdata.js");
const Sequelize = require("sequelize");
const sequelize = new Sequelize(dbConfig.DB, dbConfig.USER, dbConfig.PASSWORD, {
host: dbConfig.HOST,
dialect: dbConfig.dialect,
operatorsAliases: 0,
logging: false,
pool: {
max: dbConfig.pool.max,
min: dbConfig.pool.min,
acquire: dbConfig.pool.acquire,
idle: dbConfig.pool.idle
}
});
const db = {};
db.Sequelize = Sequelize;
db.sequelize = sequelize;
module.exports = db;Как видите у нас Sequelize и sequelize теперь находятся в одном объекте. И вызывая их через этот объект db (без повторной инициализации) вы избежите ошибки цикличности.
Теперь определим модели. В отдельном файле описываем поля (например, allmodels):
const Sequelize=require('sequelize');
exports.UserModel={
nameuser:{type:Sequelize.STRING, allowNull: false,
comments: "Имя"},
// другие поля...
};В другом определяем их и в экспорт:
const {UserModel}=require('./allmodels');
const db=require('./index');
const user=db.sequelize.define('User',UserModel);
exports.User=user;Можно сделать для экспорта функцию, которая по параметру определяет, что экспортировать:
exports.selectBaseTbl=tbl=>{
switch(tbl){
case 'article': return article;
case 'user': return user;
//.........
default: return false;
}
};Таким образом решается проблема двойного определения базы данных и исчезает ошибка цикличности на хостинге.
Комментарии: