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 构造函数,公有,私有特权和静态成员定义方法
Nov 30 Javascript
jquery 元素控制(追加元素/追加内容)介绍及应用
Apr 21 Javascript
JS正则表达式大全(整理详细且实用)
Nov 14 Javascript
jQuery实现灰蓝风格标准二级下拉菜单效果代码
Aug 31 Javascript
6种javascript显示当前系统时间代码
Dec 01 Javascript
详解javascript中原始数据类型Null和Undefined
Dec 17 Javascript
第六篇Bootstrap表格样式介绍
Jun 21 Javascript
Angular 4.0学习教程之架构详解
Sep 12 Javascript
JavaScript动态加载重复绑定问题
Apr 01 Javascript
常见的浏览器存储方式(cookie、localStorage、sessionStorage)
May 07 Javascript
vue实现从外部修改组件内部的变量的值
Jul 30 Javascript
vue3获取当前路由地址
Feb 18 Vue.js
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 curl 上传文件代码实例
2015/04/27 PHP
用PHP生成excel文件到指定目录
2015/06/22 PHP
PHP实现限制IP访问的方法
2017/04/20 PHP
php生成网页桌面快捷方式
2017/05/05 PHP
JavaScript this调用规则说明
2010/03/08 Javascript
javaScript checkbox 全选/反选及批量删除
2010/04/28 Javascript
JavaScript表达式:URL 协议介绍
2013/03/10 Javascript
jquery阻止后续事件只执行第一个事件
2014/07/24 Javascript
浅析四种常见的Javascript声明循环变量的书写方式
2015/10/14 Javascript
JS数组去重(4种方法)
2017/03/27 Javascript
微信小程序 新建登录页并实现tabBar隐藏
2017/06/13 Javascript
windows系统下更新nodejs版本的方案
2017/11/24 NodeJs
AngularJS上传文件的示例代码
2018/11/10 Javascript
JavaScript表格隔行变色和Tab标签页特效示例【附jQuery版】
2019/07/11 jQuery
Nodejs 识别图片类型的方法
2019/08/15 NodeJs
vue2.0 解决抽取公用js的问题
2020/07/31 Javascript
python使用mysql数据库示例代码
2017/05/21 Python
django限制匿名用户访问及重定向的方法实例
2018/02/07 Python
详解python多线程、锁、event事件机制的简单使用
2018/04/27 Python
pygame游戏之旅 添加游戏界面按键图形
2018/11/20 Python
Python列表list排列组合操作示例
2018/12/18 Python
Django REST框架创建一个简单的Api实例讲解
2019/11/05 Python
TensorFlow 多元函数的极值实例
2020/02/10 Python
python实现学生成绩测评系统
2020/06/22 Python
python中用ctypes模拟点击的实例讲解
2020/11/26 Python
HTML5画渐变背景图片并自动下载实现步骤
2013/11/18 HTML / CSS
HTML5实现动画效果的方式汇总
2016/02/29 HTML / CSS
丝芙兰法国官网:SEPHORA法国
2016/09/01 全球购物
Pam & Gela官网:美国性感前卫女装品牌
2018/07/19 全球购物
改变生活的男士内衣:SAXX Underwear
2019/08/28 全球购物
linux比较文件内容的命令是什么
2015/09/23 面试题
微信营销策划方案
2014/02/24 职场文书
办公室打字员岗位职责
2014/04/16 职场文书
体育个人工作总结
2015/02/09 职场文书
员工辞职信范文大全
2015/05/12 职场文书
学校运动会加油词
2015/07/18 职场文书