eggjs создает внутреннюю систему блогов (1), записывает и решает проблемы с транзакциями sql.

Egg.js

бессмысленная часть

Git-адрес проекта: https://github.com/ht-sauce/dream-admin

Рутины: Раздел личной чепухи

Физическое лицо является фронтенд-разработчиком, но компания иногда простаивает. Вот я и подумал написать что-нибудь сам, а это было скучно.Другое дело было прикинуться насильником и поднять себе зарплату.

Для серверной части я ранее использовал экспресс и сам разработал простую систему управления серверной частью.

Официально разрабатываю уже больше года.Вначале строил свою front-end страницу блога(сейчас это одностраничный проект,что не идеально.Разрабатывать лучше всего с рендерингом на стороне сервера) . Системе блогов определенно понадобится серверная часть позже, поэтому правильно продолжать использовать nodejs. Я не планирую использовать java, язык go или что-то в этом роде. Для такого новичка, как я, я не могу слишком много жевать. И java — один из самых неуклюжих языков, которые я когда-либо видел. Разработка java очень громоздка и имеет тяжелую историческую нагрузку. Учебник для новичков очень недружественный. Трудности с самостоятельным обучением Трудно начать. После входа в дверь легко сбиться с пути из-за несовершенного туториала (отсутствие того и другого).

Основная причина для java заключается в том, что в первые дни не было системы управления пакетами (текущий язык go не имеет этой проблемы), что привело к путанице java в управлении пакетами. Недружелюбен к новичкам.

Общий проект я имитирую большой проект.

В настоящее время проект разделен на четыре блока.

Система блогов (платформа отображения личной жизни, платформа записи)

Система членства (ответственная за унифицированное управление логинами и разрешениями, отдельными частями входа в систему и персонал)

Система управления интерфейсом (запись — интерфейсная платформа)

Платформа управления серверной частью

Отличная идея, но я пока только начинаю работать с бэкендом. Базовая интерфейсная страница похожа, но нет координации внутренних данных, и я всегда чувствую, что чего-то не хватает, когда я ее пишу. Хотя я могу его написать, но отличается от бэкенда, фронтенд я писал больше года. Это не кажется большой проблемой. Это просто вопрос медленного и быстрого написания, и компания может не обязательно иметь некоторые вещи, которые я себе представлял. Так что пишите бэкенд сами и играйте сами. (Но мне все еще лень, прошло всего три месяца.)

Выбор бэкенд-проекта

1. Выбор кадра

Экспресс точно не будет использоваться, поэтому у меня на бэкенде только koa framework. (Эта часть в основном относится к структуре, обычно используемой на веб-сайтах по подбору персонала, и изучает выбор в сочетании с рынком)

Я видел рамки KOA на официальном сайте, что намного лучше, чем экспресс. Но KOA имеет ощущение реагирования, все должно быть сделано самостоятельно. Экспресс одинаково.

Позже на форуме (CnoDe Community) нашел CNODE в основном отказаться от экспресс с использованием KOA, Jest и Eggjs Framework. Eghjs больше всего. Затем я пошел на официальный сайт, чтобы увидеть.

Самым большим преимуществом eggjs является то, что он принадлежит Али, и его используют для Double Eleven. Также есть eggjs, унаследовавший множество функций для новичков и новичков. Так же, как строительные леса Vue, полка создается для вас с самого начала. Вам больше не нужно делать эти утомительные вещи самостоятельно, и боги индустрии создали это для вас.

Пример:

базовый механизм безопасности

лог-система

многопроцессная загрузка

Ждать……

Среди них многопроцессорная нагрузка — это то, что я очень ценю, потому что этот новичок и ветеран может не справиться с этим. Это ключ к тому, чтобы nodejs мог использовать преимущества многоядерного процессора.

2. Базовое обучение

Я рекомендую эту мою статью, хороший вводный видеоурок. Пожалуйста, оставьте сообщение, если вы не можете скачать его. Я нахожу время загрузить Baidu Cloud, чтобы убедиться в этом лично.

https://juejin.cn/post/6844903933324820493

3. Выбор плагина

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

Я сказал что-то плохое, почему бэкенд-программистов часто высмеивают как инженеров CRUD. Даже некоторые бэкендщики думают, что они классные (на самом деле они просто добавляют, удаляют, изменяют и проверяют). Все, кто не понимает бэкенд, не знают его, но те, кто понимает, узнают. После начала работы с бэкендом самое главное — подключиться к базе данных, чтобы запросить результаты, вставить данные и вернуть данные. Так просто знать sql, и даже часть кода нужно только скопировать и вставить. Формат аккуратный и последовательный. Поэтому я думаю, что серверная часть в основном основана на многолетнем опыте и алгоритмах. Младший back-end программист проще, чем front-end, но back-end платит больше, чем front-end. Зачем? Поскольку клиентская часть не может работать без серверной части, внутренняя часть может оставить внешний интерфейс (простую страницу). На самом деле очень несправедливо, если они разделены, то основной передний конец сильнее, чем основной задний конец. Особенно в текущей внешней среде.

Сказав так много, на самом деле все находится под основным бэкэндом, нам нужно только настроить подключаемые модули фреймворка и базы данных. Ну и есть еще интерфейс записи.

MongoDB: Яйцо-Мангуст (то есть Мангуст)

В базе данных nodejs в настоящее время разделен на две части: mongdb и mysql. Один из них — nosql, а другой — реляционная база данных. Я пользовался обоими, но сказал, что не разбираюсь в nosql, а с моделированием баз данных всегда возникают проблемы, поэтому я сдался.

Тогда только mysql.

Для mysql не так много вариантов, в основном официальные плагины mysql и плагины orm (sequelize)

Для сравнения:

MySQL:

яйцо-mysql:

Это традиционный оператор sql.Основной недостаток заключается в том, что разработчики склонны к сращиванию операторов базы данных и внедрению sql.

egg-sequelize

Многие говорят, что проблемы с производительностью, на это можно не обращать внимания. Самая большая проблема — это нереляционные операторные операции. Все методы написания инкапсулированных объектов. Ключ в том, чтобы узнать это после изучения инструкции sql. Но я должен сказать, что структура ORM упрощает некоторые проблемы с написанием SQL.

Интеграция интерфейса:

графql:

Очень не понравилось, документация скудная и громоздкая. Всегда кажется, что сейчас это не имеет особого смысла. Хотя очень заманчиво.

В-четвертых, подключите базу данных.

Я не буду обучать базовой установке базы данных. Я использую mysql8.X

Подключение к базе данных очень простое, и пакет яйца готов.

выполнить первым

npm install --save egg-sequelize mysql2

Затем настройте подключение к базе данных

\dream-admin\config\plugin.js

Настроить плагин

'use strict';

/** @type Egg.EggPlugin */
module.exports = {
  static: {
    enable: true,
  },
  sequelize: {
    enable: true,
    package: 'egg-sequelize',
  },
};

Настроить соединение с базой данных (также написано преобразование формата времени mysql. См. Конфигурацию)

\dream-admin\config\plugin.js\config.default.js

/* eslint valid-jsdoc: "off" */

'use strict';

module.exports = appInfo => {
  const config = exports = {
    static: { prefix: '/dreamdht/' },
    keys: appInfo.name + '_1568770372144_7988',
    security: {
      csrf: {
        ignore: () => true,
      },
    },
  };
  config.sequelize = {
    dialect: 'mysql', // support: mysql, mariadb, postgres, mssql
    database: 'dream',
    host: 'localhost',
    port: 9906,
    username: 'root',
    password: '1111',
    timezone: '+08:00',
    // 时间格式转化
    dialectOptions: {
      dateStrings: true,
      typeCast: true,
    },
  };
  return config;
};

5. Напишите модель

По сравнению с традиционным подключаемым модулем базы данных, структура ORM имеет больше этапов написания модели. Эквивалентно построению таблиц базы данных, моделированию.

Все бизнес-модели каркаса яйца размещены в файле app\model.

мой вот такой


Возьмем пример модели: userInfo

Я не делаю здесь лишних расширений. Потому что эта статья в основном посвящена документированию операций с базами данных. Вся статья охватывает множество точек знаний. Каждый пункт требует больших усилий для прочтения документации. Особенно, если нет тылового фундамента, он еще более незаметен.

'use strict';
module.exports = app => {
  const { STRING, INTEGER, DATE, ENUM } = app.Sequelize;

  const UserInfo = app.model.define('consumer-userInfos', {
    userid: {
      type: INTEGER,
      primaryKey: true,
      comment: 'user账号表id',
    },
    nickname: {
      type: STRING(30),
      allowNull: false,
      defaultValue: '',
      comment: '昵称',
    },
    portrait: {
      type: STRING(200),
      comment: '用户头像',
    },
    sex: {
      type: ENUM('男', '女'),
      comment: '性别',
    },
    phone: {
      type: STRING(15),
      comment: '联系电话',
      unique: true,
    },
    birthday: {
      type: DATE,
      comment: '生日',
    },
    provinceAndCity: {
      type: STRING(30),
      comment: '省市区域码',
    },
    address: {
      type: STRING(100),
      comment: '详细住址',
    },
    qq: {
      type: STRING(100),
      comment: 'qq或微信信息',
    },
    email: {
      type: STRING(50),
      comment: '邮箱地址',
      unique: true,
    },
  }, { comment: '用户信息表,每个用户唯一' });

  return UserInfo;
};


6. Написание сервисов (уровень сервисов, написание бизнес-логики — все здесь)

Вот главная цель статьи.

Следующий оператор состоит из двух частей: одна — это транзакция sql, а другая — о том, как современная платформа nodejs взаимодействует с async\await для обработки ошибок.

SQL-транзакции, в основном смотрите комментарии. Мои предыдущие ошибки были в основном здесь

await ctx.model.Consumer.UserInfo.create(data, { transaction });

Неправильный способ:

await ctx.model.Consumer.UserInfo.create(data, transaction );

обработка ошибок

eggjs очень похож на традиционный бэкэнд в обработке ошибок, в основном полагаясь на try\catch для отлова ошибок.

Тогда мой логический вызов здесь заключается в том, что я являюсь уровнем управления доступом — сервисным уровнем — доступом — базой данных.

Тогда сервисный уровень сможет фактически перехватывать ошибки базы данных. Но на уровне управления я также использую try\catch для отлова ошибок. Тогда у вас должен быть тот же код, что и у меня ниже. использовать

// 返回错误信息
return Promise.reject(e);
// 或throw e;

чтобы вернуть результат ошибки, чтобы убедиться, что уровень управления также сообщает об ошибке в обычном режиме

Перейдите непосредственно к коду:

'use strict';
const Service = require('egg').Service;

class UserService extends Service {
  async find() {
    const { ctx, app } = this;
    const sequelize = app.Sequelize;
    const query = [[ sequelize.fn('COUNT', sequelize.col('id')), 'num' ]];
    // console.log(result[0].dataValues.num);
    return await ctx.model.Consumer.User.findAll({
      attributes: query,
    });
  }
  // 创建用户账号和用户信息
  async create(data) {
    // 获取当前条目数加1作为主键id
    const { ctx, app } = this;

    const sequelize = app.Sequelize;
    const query = [[ sequelize.fn('COUNT', sequelize.col('id')), 'num' ]];
    const count = await ctx.model.Consumer.User.findAll({
      attributes: query,
    });

    const id = count[0].dataValues.num + 1;
    data.id = id;
    data.userid = id;
    let transaction;
    try {
      // 启用事务
      transaction = await ctx.model.transaction();
      // 创建账号
      await ctx.model.Consumer.UserInfo.create(data, { transaction });
      await ctx.model.Consumer.User.create(data, { transaction });
      // 提交事务
      await transaction.commit();
      return true;
    } catch (e) {
      // 错误事务回滚
      await transaction.rollback();
      // 返回错误信息
      return Promise.reject(e);
    }
  }
}

module.exports = UserService;


Семь: Резюме

В статье три основных момента:

Использование транзакций ниже Sequelize. Формат довольно стандартный.

// Включить транзакцию

 transaction = await ctx.model.transaction();

// Завести аккаунт

sql деловая операция

// фиксируем транзакцию

transaction.commit();

откат при возникновении ошибки

await transaction.rollback();

Затем есть меры предосторожности при использовании транзакций. Формат кода не является неправильным.

Кроме того, часовой пояс mysql приводит к неправильному формату времени результатов запроса.

8. Спасибо

Благодаря команде Eggjs для рамок с открытым исходным кодом

Справочная статья:

продолжение китайской документации: https://demopark.github.io/sequelize-docs-Zh-CN/

Справочный блог: https://blog.csdn.net/awhlmcyn/article/details/79816494

Справочный блог: https://blog.csdn.net/clearlxj/article/details/94597734