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 相关文章推荐
动态加载iframe
Jun 16 Javascript
extjs 为某个事件设置拦截器
Jan 15 Javascript
多次注册事件会导致一个事件被触发多次的解决方法
Aug 12 Javascript
php和js对数据库图片进行等比缩放示例
Apr 28 Javascript
Bootstrap BootstrapDialog使用详解
Feb 17 Javascript
vue中mint-ui环境搭建详细介绍
Apr 06 Javascript
Vue中如何实现轮播图的示例代码
Jul 27 Javascript
vue项目关闭eslint校验
Mar 21 Javascript
p5.js 毕达哥拉斯树的实现代码
Mar 23 Javascript
vue自定义js图片碎片轮播图切换效果的实现代码
Apr 28 Javascript
JSONP解决JS跨域问题的实现
May 25 Javascript
javascript前端实现多视频上传
Dec 13 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控制用户的浏览器--ob*函数的使用说明
2007/03/16 PHP
PHP+iFrame实现页面无需刷新的异步文件上传
2014/09/16 PHP
PHP使用mkdir创建多级目录的方法
2015/12/22 PHP
PHP使用file_get_content设置头信息的方法
2016/02/14 PHP
php遍历解析xml字符串的方法
2016/05/05 PHP
PHP+jQuery实现滚屏无刷新动态加载数据功能详解
2017/05/04 PHP
在laravel5.2中实现点击用户头像更改头像的方法
2019/10/14 PHP
jquery getScript动态加载JS方法改进详解
2012/11/15 Javascript
javascript读写XML实现广告轮换(兼容IE、FF)
2013/08/09 Javascript
js使用循环清空某个div中的input标签值
2014/09/29 Javascript
AngularJS $injector 依赖注入详解
2016/09/14 Javascript
vue 封装自定义组件之tabal列表编辑单元格组件实例代码
2017/09/07 Javascript
深入浅析Vue中的Prop
2018/06/10 Javascript
详解Webpack loader 之 file-loader
2018/11/07 Javascript
js中实例与对象的区别讲解
2019/01/21 Javascript
前端深入理解Typescript泛型概念
2020/03/09 Javascript
用python分割TXT文件成4K的TXT文件
2009/05/23 Python
浅谈Python中的闭包
2015/07/08 Python
Python 使用os.remove删除文件夹时报错的解决方法
2017/01/13 Python
Python 多线程的实例详解
2017/09/07 Python
Python实现多属性排序的方法
2018/12/05 Python
在Pycharm中对代码进行注释和缩进的方法详解
2019/01/20 Python
anaconda中更改python版本的方法步骤
2019/07/14 Python
Python Sympy计算梯度、散度和旋度的实例
2019/12/06 Python
python正则表达式匹配IP代码实例
2019/12/28 Python
Pyecharts地图显示不完成问题解决方案
2020/05/11 Python
Django model.py表单设置默认值允许为空的操作
2020/05/19 Python
Html5新标签解释及用法
2012/02/17 HTML / CSS
使用phonegap操作数据库的实现方法
2017/03/31 HTML / CSS
UGG雪地靴德国官网:UGG德国
2016/11/19 全球购物
莫斯科高科技在线商店:KremlinStore
2019/03/13 全球购物
行政部工作岗位职责范本
2014/03/05 职场文书
社团活动总结格式
2014/08/29 职场文书
财务部会计岗位职责
2015/02/03 职场文书
慰问信格式规范
2015/03/23 职场文书
2019年度行政文员工作计划范本!
2019/07/04 职场文书