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 相关文章推荐
基于JQuery的访问WebService的代码(可访问Java[Xfire])
Nov 19 Javascript
jquery实现div阴影效果示例代码
Sep 16 Javascript
JS常用表单验证方法总结
May 22 Javascript
fixedBox固定div漂浮代码支持ie6以上大部分主流浏览器
Jun 26 Javascript
JavaScript极简入门教程(二):对象和函数
Oct 25 Javascript
jQuery统计上传文件大小的方法
Jan 24 Javascript
JavaScript数组前面插入元素的方法
Apr 06 Javascript
jquery插件canvaspercent.js实现百分比圆饼效果
Jul 18 jQuery
HTML5开发Kinect体感游戏的实例应用
Sep 18 Javascript
AngularJS中重新加载当前路由页面的方法
Mar 09 Javascript
vue-router路由模式详解(小结)
Aug 26 Javascript
layui 图片上传+表单提交+ Spring MVC的实例
Sep 21 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 防注入函数(格式化数据)
2011/08/08 PHP
PHP stripos()函数及注意事项的分析
2013/06/08 PHP
PHP采用XML-RPC构造Web Service实例教程
2014/07/16 PHP
PHP的Socket通信之UDP通信实例
2015/07/02 PHP
php处理静态页面:页面设置缓存时间实例
2017/06/22 PHP
jQuery阻止冒泡和HTML默认操作
2010/11/17 Javascript
javascript实现焦点滚动图效果 具体方法
2013/06/24 Javascript
三个js循环的关键字示例(for与while)
2016/02/16 Javascript
设计模式中的组合模式在JavaScript程序构建中的使用
2016/05/18 Javascript
jQuery插件cxSelect多级联动下拉菜单实例解析
2016/06/24 Javascript
jquery判断对象是否为空并遍历对象的简单实例
2016/07/26 Javascript
vue一步步实现alert功能
2017/07/05 Javascript
详解利用jsx写vue组件的方法示例
2017/07/17 Javascript
JavaScript惰性载入函数实例分析
2019/03/27 Javascript
js/jQuery实现全选效果
2019/06/17 jQuery
详解NodeJs项目 CentOs linux服务器线上部署
2019/09/16 NodeJs
[01:21:36]CHAOS vs Alliacne 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
python实现根据主机名字获得所有ip地址的方法
2015/06/28 Python
Python的Django框架中自定义模版标签的示例
2015/07/20 Python
python迭代器与生成器详解
2016/03/10 Python
python编程实现希尔排序
2017/04/13 Python
解决sublime+python3无法输出中文的问题
2018/12/12 Python
Python-ElasticSearch搜索查询的讲解
2019/02/25 Python
python使用phoenixdb操作hbase的方法示例
2019/02/28 Python
python中如何使用分步式进程计算详解
2019/03/22 Python
python使用信号量动态更新配置文件的操作
2020/04/01 Python
Python 在局部变量域中执行代码
2020/08/07 Python
Pycharm配置autopep8实现流程解析
2020/11/28 Python
css3的过滤效果简单实例
2016/08/03 HTML / CSS
英国领先的葡萄酒专家:Majestic Wine
2017/05/30 全球购物
C#如何调用Word并打开一个Word文档
2013/05/08 面试题
巾帼建功标兵事迹材料
2014/05/11 职场文书
爬山的活动方案
2014/08/16 职场文书
光棍节联谊晚会活动策划书
2014/10/10 职场文书
领导四风问题整改措施思想汇报
2014/10/13 职场文书
Python中的datetime包与time包包和模块详情
2022/02/28 Python