使用EggJS开发接口(二)使用数据库之egg-sequelize

摘要:
==用户。密码){message=“密码错误”;}否则{message=“登录成功”;数据={id:user.id};}ctx.body={message,data};}}单元exports=主控制器;注意:字段“id”不具有默认值解决方案原因id未设置为自动递增

Sequelize.JS是node里面比较常用的一个ORM(对象映射模型),提供了很多丰富的接口,egg-sequelize是基于其做的一个egg项目下的ORM插件

安装:

npm install egg-sequelize mysql2 -S
// 或者
yarn add egg-sequelize mysql2

导入到egg项目中:

// 在config/plugin.js里面添加
exports.sequelize = {
  enable: true,
  package: 'egg-sequelize'
}
 
// 或者,在config/plugin.js的module.exports里面添加
module.exports = {
  sequelize: {
    enable: true,
    package: 'egg-sequelize'
  },
};
配置:
config.sequelize = {
  dialect: 'mysql', // 表示使用mysql
  host: '127.0.0.1', // 连接的数据库主机地址
  port: 3306, // mysql服务端口
  database: 'diary', // 数据库名
  username: 'root', // 数据库用户名
  password: 'root', // 数据库密码
  define: { // model的全局配置
    timestamps: true, // 添加create,update,delete时间戳
    paranoid: true, // 添加软删除
    freezeTableName: true, // 防止修改表名为复数
    underscored: false // 防止驼峰式字段被默认转为下划线
  },
  timezone: '+8:00', // 由于orm用的UTC时间,这里必须加上东八区,否则取出来的时间相差8小时
  dialectOptions: { // 让读取date类型数据时返回字符串而不是UTC时间
    dateStrings: true,
    typeCast(field, next) {
      if(field.type === "DATETIME"){
        return field.string();
      }
      return next();
    }
  }
};

注:在默认情况下,id字段会被设置为主键,并且是AUTO_INCREMENT的,不需要我们自己声明

例如:

app/model/user.js

/**
 * 用户模型
 */
module.exports = app => {
  const { STRING, INTEGER } = app.Sequelize;
  const User = app.model.define('user', {
    id: {
      type: INTEGER,
      autoIncrement: true,
      primaryKey: true
    },
    name: {
      type: STRING,
      allowNull: false
    },
    password: {
      type: STRING(32),
      allowNull: false
    }
  });

  // 表关联的字段
  User.associate = function() {
    // 一对多
    app.model.User.hasMany(app.model.Diary, { foreignKey: 'user_id', targetKey: 'id'})
  }

  return User;
}

app/model/diary.js

/**
 * 日志模型
 */
module.exports = app => {
  const { STRING, INTEGER } = app.Sequelize;
  const Diary = app.model.define('diary', {
    id: {
      type: INTEGER,
      autoIncrement: true,
      primaryKey: true
    },
    title: {
      type: STRING,
      allowNull: false
    },
    content: {
      type: STRING,
      allowNull: false
    }
  });

  // 表关联的字段
  Diary.associate = function() {
    app.model.Diary.belongsTo(app.model.User, { foreignKey: 'user_id', targetKey: 'id'})
  }

  return Diary;
}

在 controller 中调用 model:

app/controller/home.js

'use strict';

const Controller = require('egg').Controller;

class HomeController extends Controller {
  async index() {
    const { ctx } = this;
    ctx.body = 'hi, egg';
  }

  // 添加日志
  async add() {
    const { ctx } = this;
    // 从前端获取post请求发来的数据
    const param = ctx.request.body;
    const result = await ctx.model.Diary.create({
      title: param.title,
      content: param.content,
      user_id: 2
    });
    console.log('add方法', result);
    if(result){
      ctx.body = '创建成功';
    }else{
      ctx.body = '创建失败';
    }
  }

  // 登录判断
  async loginCheck() {
    const { ctx } = this;
    // // 关联查询
    // const data = await ctx.model.User.findAll({
    //   include: {
    //     model: ctx.model.Diary
    //   }
    // });
    // ctx.body = data;

    // post请求传来的参数
    const { name, password } = ctx.request.body;
    let message = '', data = {};
    // 判断数据库里面是否存在该用户
    const user = await ctx.model.User.findOne({
      where: {
        name: name
      }
    });

    if(!user){
      message = '用户不存在';
    }else if(password !== user.password){
      message = '密码错误';
    }else{
      message = '登录成功';
      data = { id: user.id };
    }

    ctx.body = {
      message,
      data
    };
  }
}

module.exports = HomeController;

注:Field 'id' doesn't have a default value 解决方案

使用EggJS开发接口(二)使用数据库之egg-sequelize第1张

原因 id 没有设置自动递增

使用EggJS开发接口(二)使用数据库之egg-sequelize第2张

免责声明:文章转载自《使用EggJS开发接口(二)使用数据库之egg-sequelize》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇NSSM 注册windows服务Cisco IP SLA 配置实例下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

react 监听页面滚动

1. onScrollCapture html: // 如果使用typescript, 定义dom类型 private dom: HTMLDivElement | null // ReactJS中,对Div监听只需要绑定 onScrollCapture事件 <div style={{ flex: 1,...

QCefView实现与JS的交互

Cef主动向JS通信主要有一种方法:首先在Cef中 QCefEvent event ( const QString& eventName ); //定义一个CEF事件 event.setStringProperty ( const QString& key, const QString& msg ); //为事件添加参数 board...

FFmpeg解码H264及swscale缩放详解

原文  http://blog.csdn.net/gubenpeiyuan/article/details/19548019 主题 FFmpeg 本文概要:         本文介绍著名开源音视频编解码库ffmpeg如何解码h264码流,比较详细阐述了其h264码流输入过程,解码原理,解码过程。同时,大部分应用环境下,以原始码流视频大小展示并不是...

Vue项目的一些优化策略

Vue项目完成后就要从开发环境转成生产环境 一些第三方的包体积过大,导致生成js文件过于庞大,这是时候可以生成打包报告来查看项目中的问题 1.生成报告有两种方式,一种使用npm run build --report 2.另一种使用vue脚手架的ui可视化面板,在项目中输入vue ui  3.点击生产环境下的运行按钮,可以看到打包出来的js文件一共有2M之...

google代码风格(转)

Google C++ 风格指南 - 中文版 from http://code.google.com/p/google-styleguide/ 版本: 3.133 原作者: Benjy Weinberger Craig Silverstein Gregory Eitzmann Mark Mentovai Tashana Landray 翻译: Yul...

picker-view、微信小程序自定义时间选择器(非官方)

picker-view自定义时间选择器 官网的自定义时间选择器比较简陋、日期不准 下面是我自己写的一个demo <view class="baseList"> <view class="list clearfix"> <view class="fl listName"><text class="req...