PostgreSQL Node.js实现函数计算方法示例


Posted in Javascript onFebruary 12, 2019

前言

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

技术栈

  • 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');
// 导入对应的controller
const Controller = require('../controller/InqueryController');
// 获取MailSender Service
const MailService = require('./MailSender');
const Helper = require('../util/Helper');

const funcs = [
 'unsendUser',
];
// 生成一次controller
const 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);
};

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
JS不间断向上滚动效果代码
Dec 25 Javascript
jquery.validate.js插件使用经验记录
Jul 02 Javascript
jQuery实现表格行上下移动和置顶效果
Jun 05 Javascript
javascript实现表单验证
Jan 29 Javascript
jquery ajax后台返回list,前台用jquery遍历list的实现
Oct 30 Javascript
使用JS代码实现点击按钮下载文件
Nov 12 Javascript
JS中promise化微信小程序api
Apr 12 Javascript
vue中组件的过渡动画及实现代码
Nov 21 Javascript
vue引入微信sdk 实现分享朋友圈获取地理位置功能
Jul 04 Javascript
详解Vue 换肤方案验证
Aug 28 Javascript
小程序实现锚点滑动效果
Sep 23 Javascript
vue ssr服务端渲染(小白解惑)
Nov 10 Javascript
Vue 动态组件与 v-once 指令的实现
Feb 12 #Javascript
在微信小程序中保存网络图片
Feb 12 #Javascript
VUE中使用MUI方法
Feb 12 #Javascript
如何利用ES6进行Promise封装总结
Feb 11 #Javascript
在vue项目中引入vue-beauty操作方法
Feb 11 #Javascript
Vue表单控件绑定图文详解
Feb 11 #Javascript
图文讲解vue的v-if使用方法
Feb 11 #Javascript
You might like
URL Rewrite的设置方法
2007/01/02 PHP
Code:findPosX 和 findPosY
2006/12/20 Javascript
javascript 火狐(firefox)不显示本地图片问题解决
2008/07/05 Javascript
JavaScript prototype对象的属性说明
2010/03/13 Javascript
关于Jqzoom的使用心得 jquery放大镜效果插件
2010/04/12 Javascript
转换json格式的日期为Javascript对象的函数
2010/07/13 Javascript
IE无法设置短域名下Cookie
2010/09/23 Javascript
JQuery在页面中添加和除移DOM示例代码
2013/06/24 Javascript
快速查找数组中的某个元素并返回下标示例
2013/09/03 Javascript
jQuery手机拨号界面特效代码分享
2015/08/27 Javascript
全面了解js中的script标签
2016/07/04 Javascript
js验证真实姓名与身份证号,手机号的简单实例
2016/07/18 Javascript
JS中跨页面调用变量和函数的方法(例如a.js 和 b.js中互相调用)
2016/11/01 Javascript
three.js快速入门【推荐】
2017/01/21 Javascript
深入理解Node.js中的进程管理
2017/03/13 Javascript
fullPage.js和CSS3实现全屏滚动效果
2017/05/05 Javascript
微信小程序实现瀑布流布局与无限加载的方法详解
2017/05/12 Javascript
layui点击导航栏刷新tab页的示例代码
2018/08/14 Javascript
用JS实现一个简单的打砖块游戏
2019/12/11 Javascript
jQuery实现倒计时功能完整示例
2020/06/01 jQuery
vue实现打地鼠小游戏
2020/08/21 Javascript
python自定义类并使用的方法
2015/05/07 Python
Python的Django框架中if标签的相关使用
2015/07/15 Python
Python中存取文件的4种不同操作
2018/07/02 Python
Python 利用切片从列表中取出一部分使用的方法
2019/02/01 Python
如何在python中实现随机选择
2019/11/02 Python
利用PyQt中的QThread类实现多线程
2020/02/18 Python
python简单实现最大似然估计&scipy库的使用详解
2020/04/15 Python
css3通过scale()、rotate()实现放大、旋转
2020/03/19 HTML / CSS
《冬阳童年骆驼队》教学反思
2014/04/15 职场文书
教师党员公开承诺事项
2014/05/28 职场文书
大学生学习新党章思想汇报
2014/10/25 职场文书
2014年精神文明建设工作总结
2014/11/19 职场文书
大学生个人年度总结范文
2015/02/15 职场文书
2015年采购员工作总结
2015/04/27 职场文书
公司岗位说明书
2015/10/08 职场文书