Mysql

一、安装配置

    $ npm i --save egg-mysql

    // config/plugin.js  开启插件
    exports.mysql = {
            enable: true,
            package: 'egg-mysql',
    };

egg-monogoose

一、安装配置

    $ npm i egg-mongoose --save

    // {app_root}/config/plugin.js
    exports.mongoose = {
        enable: true,
        package: 'egg-mongoose',
    };

    // {app_root}/config/config.default.js
    module.exports = {
        mongoose: {
            url: 'mongodb://127.0.0.1:27017/ibg_node_core',
            options: {
                db: { native_parser: true },
                server: { poolSize: 5 },
                user: 'core',
                pass: 'we123',
            },
        },
    }

    // 多个mongos配置
    // {app_root}/config/config.default.js
    exports.mongoose = {
        url: 'mongodb://mongosA:27501,mongosB:27501',
        options: {}
    };

    // log
    module.exports = {
        logger: {
            dir: '/home/admin/logs/demoapp',        // logger文件的目录
            level: 'DEBUG',                         // 开deubg模式
        },
    };


二、定义Schema

    // app/modle/reportWarningConfig.js

    module.exports = app => {
        const mongoose = app.mongoose;
        const ReportWarningConfigSchema = new mongoose.Schema({
                actionCode: { type: String, unique: true, trim: true }, // 动作编码
                interval: { type: Number, default: 1800 },  // 扫描间隔时间,单位:秒 默认 30分钟
                emailConfig: { // 发送邮件条件
                    appKey: { type: String, default: '', trim: true },
                    appSecret: { type: String, default: '', trim: true },
                    recipient: { type: [String] },  // 收件人
                },
                lastExecutedTime: { type: Date, default: Date.now },   // 最近执行时间
            }, 
            {
                timestamps: true,               // 设置timestamps,多加两个字段createdTime、updatedTime,来记录插入时间和更新时间
                collection: 'report_warning_config',
            }
        );

        return mongoose.model('ReportWarningConfig', ReportWarningConfigSchema);
    };


三、常用语句

    1、await app.model.login.find(条件): 返回的是一组数据, []

    2、await app.model.login.findOne(条件): 只返回一条数据, 如果没有匹配的返回null,

    3、await app.model.login.update(条件, 要更新的文档, 回调方法): 更新数据

    4、let loginTask = new app.model.login({ username: 'siguang', password: 'ssssss'});     
            let doc = await loginTask.save();        // 插入数据 

    5、exec(callback): 在查询、更新后会执行一个回调函数来查看是否成功执行

    6、save(function(err, kitten){  }): 存储


四、Example

    1、查询

        async queryMonitorTask(){
            let monitorTaskList = await app.model.ReportWarningConfig.find();          // app.model.ReportWarningConfig 来指定用哪个文档
            return app.renderBody({
                statusType: app.statusType.success,
                data: {
                    list: monitorTaskList
                }
            });
        }


    2、更新

        更新需要先将文档查回来后,在修改某一个字段,如果一直更新会覆盖

        async updateMonitorTask(params){
            let response;
            let condition = {_id: params.id};
            let doc = await app.model.ReportWarningConfig.findOne(condition);       // 通过id来取到当前数据

            if(doc){
                doc.interval = params.interval;
                doc.emailConfig.recipient = params.emailRecipient;
                doc.smsConfig.recipient = params.smsRecipient;

                await doc.save();
                response = app.renderBody({
                    statusType: error,
                    error: error,
                });
            }
            else{
                response = app.renderBody({
                    statusType: app.statusType.error,
                    error: doc,
                });
            }

            return response;
        }


    3、插入数据

        插入数据将使用save()

        async insertMonitorTask(){
        const {ctx, app, service} = this;
        const {actionCode, interval, emailRecipient, smsRecipient} = ctx.request.body;

        // 将要插入的数据加到model中
        let monitorTask = new app.model.ReportWarningConfig({   // 注意这里使用new 
            actionCode,
            interval,
            emailConfig: {
                recipient: emailRecipient
            },
            smsConfig: {
                recipient: smsRecipient
            }
        })

        // 使用save()来插入
        let doc = await monitorTask.save();

        let response = app.renderBody({
            statusType: app.statusType.success,
            data: doc._id
        });
        ctx.body = response;
    }

mongoose 积累

一、查询出来的数据不能修改

async getNewsContent(params){
    let doc = await app.model.News.findOne({_id: params.id});

    // 不能直接修改doc的对象,需要通过toObject()方法来转成对象的形势
    let newDoc = doc.toObject();
    newDoc.createdAt = app.dateFormat(new Date(newDoc.createdAt).getTime(), 'yyyy-MM-dd hh:mm:ss')
    newDoc.updatedAt = app.dateFormat(new Date(newDoc.updatedAt).getTime(), 'yyyy-MM-dd hh:mm:ss')
    console.log(`ResponseAAA ----- ${JSON.stringify(newDoc)}`)

    return {
        data: newDoc,
        message: '获取成功',
        status: 0
    }
}

| https://github.com/eggjs/egg-mongoose