博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
笔记:PostgreSQL 、Node.js 、函数计算
阅读量:6092 次
发布时间:2019-06-20

本文共 5053 字,大约阅读时间需要 16 分钟。

前言

由于工作需要,设计到了阿里云的函数计算,便记录下来

  • 技术栈
    • node.js
    • postgresql
    • nodemailer

controller + services

  • 编写postgresql lib

    不管异常还是正常都返回resolve,在resolve中处理结果,通过success字段去处理

    const { Pool } = require('pg');const config = require('../config/default.js');const {  database: {    HOST,    PORT,    DATABASE,    USERNAME,    PASSWORD,  },} = config;const pool = new Pool({  port: PORT,  host: HOST,  user: USERNAME,  password: PASSWORD,  database: DATABASE,});/** *  * @param sql 接收的sql语句 * @param {Array} values sql语句参数 * @return { Object } { success: boolean, err || data  } */const query = async function( sql = 'select NOW()', values = []) {  return new Promise(resolve => {    pool.connect((err, client, release) => {      if (err) {        return console.error('Error acquiring client', err.stack)      }      const params = Array.isArray(values) ? [...values] : [values];      client.query(sql, params, (error, result) => {        release();        if (error) {          console.error('Error executing query', error.stack);          resolve({            success: false,            error,          });        }        resolve({          success: true,          data: result.rows,        });      });    });  });}module.exports = {  query,}复制代码
    • config配置文件如下
      const config = {  // 数据库配置  database: {    DATABASE: 'databasename',    USERNAME: 'root',    PASSWORD: '123456',    PORT: '3433',    HOST: 'localhost',  },};module.exports = config;复制代码
  • Controller

    • BaseController

    首先编写一个基类,用于封装一些通用的方法

    const pool = require('../lib/postgre'); // 导入封装好的mysql库const { query } = pool; // 导入query方法class BaseController {  constructor() {  }  // 查询表内所有数据(非删除)  async list() {    const sql = `select * from ${
    this.table}`; return await query(sql); } // 执行方法 async excute(sql, vals = []) { return await query(sql, vals); } // log 方法 log({func, err}) { console.log(`excute function[${func}] occured error : ${err.message || err}`); }}module.exports = BaseController;复制代码
    • InqueryController

    具体的业务逻辑Controller类

    const BaseController = require('./BaseController'); // 获得基类// 继承基类class InqueryController extends BaseController {  constructor() {    super();    this.table = 'data_table'; // 赋值table  }  // 可以重写基类的方法,如果有业务需要  async list() {    const sql = `select * from ${
    this.table} ORDER BY created_at DESC `; return await this.excute(sql); } async getUnsendCustomer(vals) { const sql = `select * from ${
    this.table} where created_at > $1 ORDER BY created_at DESC`; // 统一在基类调用sql参数 return await this.excute(sql, vals); } }module.exports = InqueryController;复制代码
  • Service

    • BaseService

    统一封装的方法,基类

    // 需要绑定this的方法const funcs = [  'list',]class BaseService {  constructor() {    this.controller = null;    // 循环遍历绑定this, 在koa绑定route的时可用到    funcs.forEach(item => {      this[item] = this[item].bind(this)    });  }  // 查询方法  async list(ctx) {    if (!ctx) {      return await this.controller.list();    }    // controller返回的是一个对象,success(成功为true, 失败为false), data(成功则有此数据), err(失败则有此对象)    const { success: flag, data, error } = await this.controller.list();    if (flag) {      // success      ctx.body = {        data,        code: 200,      }    } else {      // failed      ctx.body = {        code: 500,        error,      };    }  }}module.exports = BaseService复制代码
    • InqueryService

    具体的业务逻辑

    // 导入基类const BaseService = require('./BaseService');// 导入对应的controllerconst Controller = require('../controller/InqueryController');// 获取MailSender Serviceconst MailService = require('./MailSender');const Helper = require('../util/Helper');const funcs = [  'unsendUser',];// 生成一次controllerconst controller = new Controller();class InqueryService extends BaseService {  constructor() {    super()    // 绑定对应的controller    this.controller = controller;    funcs.forEach(item => {      this[item] = this[item].bind(this);    });  }  getMailOpts(i) {    // you can use the data from database to combine the message    const message = 'Hello world!';    return return {        message,        // 可以从配置文件读取或者oss        to: 'xxxx@gmail.com',        subject: 'Hello World',    };  }    async unsendUser() {    const list = await this.controller.list();    if (list.length > 0) {      const mailer = new MailService();      const errorList = [];      iterateList.forEach(async i => {        const mailerOption = this.getMailOpts(i);        const { success, ...rest } = await mailer.sendToAuitAdmin(mailerOption);        if (!success) {          errorList.push(rest);        }      });      const lastestTime = iterateList[0].created_at;      if (errorList.length === 0) {        return {            code: 200,            message: 'Success',        };      }    } else {      return {        code: 204,        message: 'No user found',      };    }  }}module.exports = new InqueryService();复制代码
  • index.js

函数计算的逻辑

const inqueryService = require('./services/InqueryService'); exports.handler = async function(event, context, callback) {   const result = await inqueryService.unsendUser();   callback(null, result);};复制代码

转载于:https://juejin.im/post/5c61198af265da2d9c384cd8

你可能感兴趣的文章
[9-13]Shell系列3——分支结构if与case语句
查看>>
Linux系统上的任务计划(at、crontab)的详细使用方法
查看>>
使用emacs的org-mode进行时间管理(二)——TODO
查看>>
JavaScript强化教程——DOM编程(两种控制div移动的方法)
查看>>
生成自己的Alphanumeric/Printable shellcode
查看>>
云计算服务和应用产品价格是多少才合适呢?
查看>>
怎样让山寨安卓机享有google map服务
查看>>
深入学习Java虚拟机——类加载机制
查看>>
为Windows下的Apache服务器添加防DDoS模块
查看>>
JavaScript函数内部属性arguments
查看>>
PHP如何对在线用户状态进行检测
查看>>
硬盘克隆之HDclone
查看>>
公司技术特点
查看>>
MongoDB【最新版V2.6】- 系列 1:Mongdb 启动的基本配置
查看>>
自动化运维工具——ansible
查看>>
LVM
查看>>
mysql数据的binlog处理方法
查看>>
求最大公约数
查看>>
glut输出文字
查看>>
位运算
查看>>