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 相关文章推荐
javascript获取当前ip的代码
May 10 Javascript
简介alert()与console.log()的不同
Aug 26 Javascript
Jquery 垂直多级手风琴菜单附源码下载
Nov 17 Javascript
浅析Javascript匿名函数与自执行函数
Feb 06 Javascript
AngularJS实现Input格式化的方法
Nov 07 Javascript
基于JavaScript实现微信抢红包功能
Jul 20 Javascript
Angular.js初始化之ng-app的自动绑定与手动绑定详解
Jul 31 Javascript
详解React Native网络请求fetch简单封装
Aug 10 Javascript
Vue CLI3 开启gzip压缩文件的方式
Sep 30 Javascript
Vuepress 搭建带评论功能的静态博客的实现
Feb 17 Javascript
js 对象使用的小技巧实例分析
Nov 08 Javascript
vue 子组件watch监听不到prop的解决
Aug 09 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里的JS打印函数
2006/10/09 PHP
PHP date函数参数详解
2006/11/27 PHP
php array_intersect()函数使用代码
2009/01/14 PHP
PHP实现删除非站内外部链接实例代码
2014/06/17 PHP
ThinkPHP3.2框架自定义配置和加载用法示例
2018/06/14 PHP
小程序微信支付功能配置方法示例详解【基于thinkPHP】
2019/05/05 PHP
PHP使用ajax的post方式下载excel文件简单示例
2019/08/06 PHP
Javascript面向对象编程
2012/03/18 Javascript
实现动画效果核心方式的js代码
2013/09/27 Javascript
js的2种继承方式详解
2014/03/04 Javascript
HTML5之WebSocket入门3 -通信模型socket.io
2015/08/21 Javascript
浅谈js for循环输出i为同一值的问题
2017/03/01 Javascript
基于angular实现三级联动的生日插件
2017/05/12 Javascript
详解React Native开源时间日期选择器组件(react-native-datetime)
2017/09/13 Javascript
如何编写一个d.ts文件的步骤详解
2018/04/13 Javascript
node实现分片下载的示例代码
2018/10/17 Javascript
ionic+html5+API实现双击返回键退出应用
2019/09/17 Javascript
jQuery操作事件完整实例分析
2020/01/10 jQuery
利用Python中的pandas库对cdn日志进行分析详解
2017/03/07 Python
详解Python进程间通信之命名管道
2017/08/28 Python
利用python解决mysql视图导入导出依赖的问题
2017/12/17 Python
python selenium 获取标签的属性值、内容、状态方法
2018/06/22 Python
Python算法中的时间复杂度问题
2019/11/19 Python
通过python实现windows桌面截图代码实例
2020/01/17 Python
解决pyinstaller打包运行程序时出现缺少plotly库问题
2020/06/02 Python
Python Excel vlookup函数实现过程解析
2020/06/22 Python
英国最大的割草机购买网站:Just Lawnmowers
2019/11/02 全球购物
管理失职检讨书
2014/02/12 职场文书
家长对学生的评语
2014/04/18 职场文书
学雷锋宣传标语
2014/06/25 职场文书
初中学习计划书范文
2014/09/15 职场文书
工作期间打牌检讨书范文
2014/11/20 职场文书
学校后勤工作总结2015
2015/05/15 职场文书
解除处分决定书
2015/06/25 职场文书
2016入党积极分子党课学习心得体会
2015/10/09 职场文书
JavaScript ES6的函数拓展
2022/01/18 Javascript