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 相关文章推荐
最新优化收藏到网摘代码(digg,diigo)
Feb 07 Javascript
Javascript中的常见排序算法
Mar 27 Javascript
JavaScript之IE的fireEvent方法详细解析
Nov 20 Javascript
jquery实现全选、反选、获得所有选中的checkbox
Sep 13 Javascript
jQuery实现只允许输入数字和小数点的方法
Mar 02 Javascript
JavaScript基础知识点归纳(推荐)
Jul 09 Javascript
javascript 分号总结及详细介绍
Sep 24 Javascript
Angular和Vue双向数据绑定的实现原理(重点是vue的双向绑定)
Nov 22 Javascript
详解如何使用Vue2做服务端渲染
Mar 29 Javascript
用node-webkit把web应用打包成桌面应用(windows环境)
Feb 01 Javascript
angular4自定义表单控件[(ngModel)]的实现
Nov 23 Javascript
微信小程序和H5页面间相互跳转代码实例
Sep 19 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边学边教》(01.开篇――准备工作)
2006/12/13 PHP
解析PHP中ob_start()函数的用法
2013/06/24 PHP
php通过执行CutyCapt命令实现网页截图的方法
2016/09/30 PHP
php打开本地exe程序,js打开本地exe应用程序,并传递相关参数方法
2018/02/06 PHP
prototype Element学习笔记(篇一)
2008/10/26 Javascript
jquery $.each() 使用小探
2013/08/23 Javascript
jQuery新的事件绑定机制on()示例应用
2014/07/18 Javascript
初识Node.js
2014/09/03 Javascript
60个很实用的jQuery代码开发技巧收集
2014/12/15 Javascript
IE浏览器下PNG相关功能
2015/07/05 Javascript
Bootstrap基本插件学习笔记之模态对话框(16)
2016/12/08 Javascript
ajax与json 获取数据并在前台使用简单实例
2017/01/19 Javascript
基于React实现表单数据的添加和删除详解
2017/03/14 Javascript
如何把vuejs打包出来的文件整合到springboot里
2018/07/26 Javascript
微信小程序webview组件交互,内联h5页面并网页实现微信支付实现解析
2019/08/16 Javascript
微信小程序里引入SVG矢量图标的方法
2019/09/20 Javascript
小程序api实现promise封装过程解析
2019/11/21 Javascript
vue+springboot图片上传和显示的示例代码
2020/02/14 Javascript
Python实现模拟浏览器请求及会话保持操作示例
2018/07/30 Python
python实现的config文件读写功能示例
2019/09/24 Python
用什么库写 Python 命令行程序(示例代码详解)
2020/02/20 Python
PyQt5高级界面控件之QTableWidget的具体使用方法
2020/02/23 Python
使用html5制作loading图的示例
2014/04/14 HTML / CSS
在C语言中"指针和数组等价"到底是什么意思?
2014/03/24 面试题
两只小狮子教学反思
2014/02/05 职场文书
扩大国家免疫规划实施方案
2014/03/21 职场文书
项目合作协议书
2014/04/16 职场文书
企业家王石演讲稿:坚持与放下
2014/04/27 职场文书
安全教育演讲稿
2014/05/09 职场文书
教师思想作风整顿个人剖析材料
2014/10/10 职场文书
煤矿隐患排查制度
2015/08/05 职场文书
什么是求职信?求职信应包含哪些内容?
2019/08/14 职场文书
导游词之南京莫愁湖公园
2019/11/13 职场文书
带你彻底理解JavaScript中的原型对象
2021/04/14 Javascript
Win7/8.1用户可以免费升级到Windows 11系统吗?
2021/11/21 数码科技
利用JavaScript写一个简单计算器
2021/11/27 Javascript