Серверная служба сборки Koa2, mySQL и PM2

koa
Серверная служба сборки Koa2, mySQL и PM2

Тссс! Длинная фраза.

Как фронтенд-разработчик, мы обычно больше всего контактируем с серверной частью — это стыковка интерфейса. Так как же коллеги из back-end пишут интерфейс для наших студентов front-end, чтобы получать данные из базы данных и выполнять какие-то причудливые функции? Сегодня мы будем использоватьKoa2 & mySqlЧтобы создать внутренний сервер, напишите свой собственныйapiкитайская мечта!


предисловие

Для некоторых партнеров по фронтенд-разработке бэкенд-разработка может быть незнакомой областью, ведь работа с фронтендом сейчас тяжелая (как я могу изучить утку бэкенд-разработки!). к счастьюNode.jsЭто оружие позволяет нам внедрять некоторые внутренние технологии на основе наших существующих навыков работы с интерфейсом, что также снижает порог для нас, чтобы начать работу с серверной частью.

Сяоке (дон) любовь (кси), которую я вам сегодня представлю, является моим последним проектом (этот проект был созданkoa2+mysql + pm2в качестве фоновой службы)Koa2 & MySQL & PM2Базовый шаблон. Цель состоит в том, чтобы позволить нашим внешним партнерам напрямую использовать его для разработки интерфейсов и реализации своих мечтаний.

репозиторий кодаGitHub.com/One Billion/Женщины могут…

В настоящее время в учебнике рассматривается использование pm2 для запуска службы в среде Windows.devсреда для тестирования


Цель

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


использовать технологию

  • Koa2
  • MySql (пожалуйста, убедитесь, что у вас установлена ​​Windowsmysql, и может начать нормальноmysql)
  • PM2 (Убедитесь, что ваши окна установленыPM2, и может начать нормальноPM2)


Руководство по установке программного обеспечения

  • MySqlУстановить:blog.CSDN.net/WeChat_4343…
    • УстановитьwampилиphpstudyЭти два артефакта будут автоматически установлены для васMySql, который в основном удовлетворяет ваше обучение и развитие. Если вы хотите использовать его в производственной среде, я считаю, что в вашей среде уже есть необходимое программное обеспечение.
  • PM2Установить:nuggets.capable/post/684490…
    • вышеPM2Учебник - это статья, которую я написал в прошлый раз (написание немного тухлое, я больше не могу его читать, ха-ха, ноpm2Установка очень проста, вы можете посмотреть или найти соответствующие полные руководства на Baidu)


структура кода



Конфигурация среды

использовать этот наборKoa2 & MySQL & PM2Перед базовым шаблоном необходимо убедиться, что на вашем компьютере установленаnode、mysql、PM2 


клонировать код

гит-адрес: чttps://github.com/yigeyi/funnyProject.git


создать базу данных

В файле кода, который я предоставилmysqlпостроение столаsqlзаявление, вам необходимо создатьdev_dbБаза данных, после создания, выполняет код в файлеdev_db.sqlфайл


установка кода

npm i    //就这样子,先把node繁重的node_module安装下来,嘿嘿

//如果npm不行,那就试一下 cnpm i


запустить службу

использоватьpm2 start pm2.config.js --only dev начатьkoa2Project, когда появится содержимое, как на снимке экрана ниже, подтвердите своеkoa2Проект стартовал корректно.


В этот момент вы можете использоватьhttp://localhost:3200Сделать проект доступа (о3200конфигурация порта, которую я объясню ниже)


Инструкции по настройке

Основной рабочий процесс проекта:pm2 start pm2.config.js --only dev/prod/testПосле запуска проекта (вы также можете использоватьnpm run dev/prod/test),koa2Различные конфигурации будут выполняться через текущую запущенную среду.configпараметр(app.jsимпортировать файл конфигурации), таким образом, используя разные端口а такжеmysqlКонфигурация параметров (настраивается вconfigпапка, подробности ниже)


введение в конфигурацию app.js

const Koa = require('koa')

const app = new Koa() 
const env = process.env.NODE_ENV;
const config = require('./config')
const router = require('./app/router')
...
/*更多的配置可以拉取仓库代码进行查看*/


Конфигурация среды запуска

Конфигурация PM2: pm2.config.js

let startFile = "./app.js"
module.exports = {
  apps: [{
    name: "prod",
    script: startFile,
    env: {
      "NODE_ENV": "production"
    }
  }, {
    // 测试环境
    name: "test",
    script: startFile,
    env: {
      "NODE_ENV": "test"
    }
  }, {
    // 开发环境
    name: "dev",
    script: startFile,
    env: {
      "NODE_ENV": "development"
    }
  }
  ]
}


Конфигурация параметров среды: /conf/config.*.js


/*conf.dev.js*/
const conf = {
  port: 3200, //启动端口 ,这个根据你电脑环境的实际情况来配置
  base_url: '',// 当前api服务器的域名
  mysql: { // mysql数据库信息
    host: 'localhost',
    port: '3306',
    database: 'dev_db',  //你可以修改你的数据库名字
    user: 'root',  //数据库登录账户 你寄己来
    password: '', //数据库登录密码 我就不知道你的是啥啦
    charset: 'UTF8mb4'
  }
}
module.exports = conf;

Путем настройки различныхconfigПосле этого, когда мы проходимpm2 start pm2.config.js --only dev/prod/test,koaбудет основываться на нашемpm2.config.jsнастроен вNODE_ENVЧтобы определить, какова текущая операционная среда, и передать/config/index.jsZhonglai использует разные порты конфигурации и параметры


Конфигурация базы данных

Путь к файлу конфигурации:/db/mysql.js

const db = require("mysql");
const config = require('../config').mysql;
const client = function () {}
var pool = db.createPool({
  host: config.host,
  port: config.port,
  user: config.user,
  password: config.password,
  database: config.database,
  charset: 'UTF8mb4'
});


конфигурация маршрутизации

Конфигурация маршрутизации:/router/index.js

/*router/index.js*/
const router = require('koa-router')()
let app = require('./v1.js')
//接口映射
router.use('/api/app', app.routes(), app.allowedMethods())
// vue history 设置
router.get('*', async(ctx, next)=>{
  return await ctx.render('index', {})
})
//返回注册路由
module.exports = router


Создание модели базы данных (Модели)

Modelглавным образом рассказатьsequelizeкак отображать таблицы базы данных,
sequelize.define(modelName, attributes, [options]) -> ModalЭтот метод экземпляра используется для определения новогоmodel(Модель).modelЭквивалентно таблице в базе данных, объект не может быть создан через конструктор, а только черезsequelize.define()илиsequelize.import()создание метода
Второй параметр — указать имя столбца и тип данных, если это первичный ключ, то его нужно указать более подробно. Третий параметр — дополнительная настройка

конкретныйsequelizeКонфигурация для использования может относиться ккитайский документучиться

//eg:
/*models\sequelize-model\test.js*/
module.exports = function(sequelize, DataTypes) {
  return sequelize.define('test', {
    id: {
      type: DataTypes.INTEGER(11).UNSIGNED,
      allowNull: false,
      primaryKey: true,
      autoIncrement: true
    },
    nick_name: {
      type: DataTypes.INTEGER(11),
      allowNull: false
    },
  }, {
    tableName: 'test',
    timestamps: false
  });
};

существуетModelКод, написанный в, на самом деле с намиmysqlСтруктура таблицы, написанная в mysql, одинакова, но выражается на разных языках, то есть, если вы добавляете таблицу или поле в mysql, вам также необходимо добавить таблицу или поле в соответствующийmodelдля обновления связанных полей. Существуют также плагины (промежуточное программное обеспечение), которые могут автоматически сопоставлять структуру таблицы базы данных с моделью, но при первом использовании я обнаружил небольшую проблему, поэтому не стал его использовать.

/*mysql 创建表结构*/
CREATE TABLE `test` (
	`id` INT(11) NOT NULL AUTO_INCREMENT,
	`nick_name` VARCHAR(50) NULL DEFAULT '',
	PRIMARY KEY (`id`)
)
COLLATE='utf8mb4_general_ci'
ENGINE=MyISAM
AUTO_INCREMENT=5
;



Напишите интерфейс!

Интерфейс написан, и когда мы получим доступ к интерфейсу, он будет в /router/v1Найдите соответствующее имя маршрутизации в , а затем получите доступ к нашему соответствующему адресу интерфейса контроллера для обработки бизнес-процессов.
router/v1Унифицированное сопоставление интерфейса упаковки

/*router/v1*/
//业务接口
const router = require('koa-router')()
// 引入不同控制器接口文件
// 根据不同的业务模块我们可以创建不同的controller,我们可以把相同模块的接口写在相同的controller中,并通过此处进行引入,例如 test1
const test = require('../controller/test')
const test1 = require('../controller/test1') 
const test2 = require('../controller/test2') 

//接口映射
//接口访问地址http://localhost:port/api/app/test
///api/app这一段已经在index.js中配置了前缀,所以在写接口的时候需要加上api/app/
//controller
router.post('/test',test.getTest)
router.post('/createData',test.createData)
//controller1
router.post('/test1',test1.getTest)
//controller和service分离部分
router.post('/test2',test2.getTest)
module.exports = router


Контроллер:controller/*.js

/*controller/test.js*/
const models = require('../models')
const {
  joi,
  validateParams
} = require('../base/controller.js')
module.exports = {
  //获取数据库数据
  async getTest(ctx){
    let data = {
      tip: '你安装了数据库就可以把上面注释打开'
    }
    return ctx.output({data:data},'获取成功',0)
  },
  async createData(ctx){
    //参数验证
    //通过获取post传递过来的参数
    //再使用模型把数据插入数据库
    const schema = joi.object().keys({
      nick_name: joi.string().required()
    })
    validateParams(ctx.input, schema)
    let nick_name = ctx.input.nick_name
    let parmas = {
      nick_name: nick_name
    }
    let res = await models.test.create(parmas)
    if(res){
      return ctx.output({},'添加成功',0)
    }
    // let data = {
    //   tip: '你安装了数据库就可以把上面注释打开'
    // }
    // return ctx.output({data:data},'获取成功',0)
  }
}


До сих пор, после прохождения вышеуказанной серии конфигураций и резюме кода, мы можем пройтиpostmanПроверим, удачен ли интерфейс!


Разделение контроллера контроллера и сервисного уровня

Когда наш бизнес сложен, мы не хотим, чтобы логика обработки базы данных смешивалась с нашей обычной бизнес-логикой, в это время мы можем разделить операции обработки базы данных и поместить их в однуserviceслой, затем контроллерcontrollerпросто обрабатывать нашу бизнес-логику

Конкретная операция: путем добавленияserviceпапку, а затем создайте другуюserviceфайлы модулей, например.serviceTest2.js, при этом ставяtest2Операции, связанные с операциями базы данных, извлекаются вserviceTest2.jsТаким образом, мы можем четко знать, что делают наши различные бизнес-уровни, и нам также удобно поддерживать это.

/*app\controller\test2.js*/
//这个文件演示 控制器和service层分离
const serviceTest = require('../service/v1/serviceTest2.js')
module.exports = {
  //获取数据库数据
  async getTest(ctx){
    let res = await serviceTest.getTest()
    return ctx.output({data:res},'获取成功',0)
  }
}

/*app\service\v1\serviceTest2.js*/
const models = require('../../models')
module.exports = {
  //获取数据库数据
  async getTest(ctx){
    let res = await models.test.findOne({
      where: {
        id: 1
      }
    })
    let data = {
      name: res.dataValues.nick_name
    }
    // let data = {
    //   tip: '这里从控制器抽离出来的操作数据库的东西,你如果安装了mysql,可以打开上面的注释'
    // }
    return data
  }
}

PM2 больше операций

pm2 restart pm2.config.js --only dev/prop/test  //重启服务
pm2 log // 查看日志
pm2 kill //杀死进程

Официальная документация: https://pm2.keymetrics.io/docs/usage/quick-start/


напиши в конце

  • Вышеупомянутая статья — это то, над чем я работал последние два дня вkoa2Набор шаблонов кода, извлеченных из проекта, каждому нужно только клонировать код и убедиться, что необходимое программное обеспечение установлено на компьютере и может быть запущено.koa2Запустите проект и напишите API.
  • Это статья для простого обмена начального уровня. Если есть какая-либо ошибка, я надеюсь, что вы поможете ее исправить, большое спасибо.
  • Если вы думаете, что все в порядке, я надеюсь, вы можете дать мне одино звезда,Большое Вам спасибо