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 相关文章推荐
解决Extjs上传图片无法预览的解决方法
Mar 22 Javascript
javascript中加号(+)操作符的一些神奇作用
Jun 06 Javascript
从数据库读取数据后将其输出成html标签的三种方法
Oct 13 Javascript
Javascript模拟加速运动与减速运动代码分享
Dec 11 Javascript
浅谈JavaScript Date日期和时间对象
Dec 29 Javascript
js跨域请求的5中解决方式
Jul 02 Javascript
JS获取下拉框显示值和判断单选按钮的方法
Jul 09 Javascript
asp.net中oracle 存储过程(图文)
Aug 12 Javascript
跟我学习javascript的执行上下文
Nov 18 Javascript
JavaScript中的this,call,apply使用及区别详解
Jan 29 Javascript
jQuery日程管理控件glDatePicker用法详解
Mar 29 jQuery
解决vue bus.$emit触发第一次$on监听不到问题
Jul 28 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
php数组函数序列之array_slice() - 在数组中根据条件取出一段值,并返回
2011/11/07 PHP
PHP autoload使用方法及步骤详解
2020/09/05 PHP
javascript事件模型代码
2007/07/01 Javascript
js 实现无缝滚动 兼容IE和FF
2009/07/15 Javascript
自己写了一个展开和收起的多更能型的js效果
2013/03/05 Javascript
Jquery加载时从后台读取数据绑定到dropdownList实例
2013/06/09 Javascript
Javascript实现动态菜单添加的实例代码
2013/07/05 Javascript
js出生日期 年月日级联菜单示例代码
2014/01/10 Javascript
Javascript基础知识(二)事件
2014/09/29 Javascript
jQuery中:header选择器用法实例
2014/12/29 Javascript
JavaScript事件学习小结(三)js事件对象
2016/06/09 Javascript
微信小程序ajax实现请求服务器数据及模版遍历数据功能示例
2017/12/15 Javascript
jQuery实现鼠标响应式淘宝动画效果示例
2018/02/13 jQuery
Angular5给组件本身的标签添加样式class的方法
2018/04/07 Javascript
使用iView Upload 组件实现手动上传图片的示例代码
2018/10/01 Javascript
详解VUE调用本地json的使用方法
2019/05/15 Javascript
解决echarts vue数据更新,视图不更新问题(echarts嵌在vue弹框中)
2020/07/20 Javascript
vue之封装多个组件调用同一接口的案例
2020/08/11 Javascript
python去掉行尾的换行符方法
2017/01/04 Python
用python脚本24小时刷浏览器的访问量方法
2018/12/07 Python
基于PyQt4和PySide实现输入对话框效果
2019/02/27 Python
Django中的用户身份验证示例详解
2019/08/07 Python
python将图片转base64,实现前端显示
2020/01/09 Python
Python+MySQL随机试卷及答案生成程序的示例代码
2021/02/01 Python
纯CSS3实现运行时钟的示例代码
2021/01/25 HTML / CSS
世界上最大的折扣香水店:FragranceNet.com
2016/10/26 全球购物
英国第一职业高尔夫商店:Clickgolf.co.uk
2020/11/18 全球购物
初一生物教学反思
2014/01/18 职场文书
学生干部的自我评价分享
2014/01/18 职场文书
2014年党员自我评议(5篇)
2014/09/12 职场文书
个人德育工作总结
2015/03/05 职场文书
2019中秋节祝福语大全,提前收藏啦
2019/09/10 职场文书
Redis延迟队列和分布式延迟队列的简答实现
2021/05/13 Redis
详解Go与PHP的语法对比
2021/05/29 PHP
源码解读Spring-Integration执行过程
2021/06/11 Java/Android
Python获取江苏疫情实时数据及爬虫分析
2021/08/02 Python