亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > JS > 正文

PostgreSQL Node.js實現函數計算方法示例

2024-05-06 16:48:03
字體:
來源:轉載
供稿:網友

前言

由于工作需要,設計到了阿里云的彈性計算,這里便記錄下來

技術棧

  • 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');// 導入對應的controllerconst Controller = require('../controller/InqueryController');// 獲取MailSender Serviceconst MailService = require('./MailSender');const Helper = require('../util/Helper');const funcs = [ 'unsendUser',];// 生成一次controllerconst 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);};

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VeVb武林網的支持。


注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
成人国产精品久久久久久亚洲| www.欧美三级电影.com| 欧美日韩国产va另类| 亚洲人永久免费| 日本久久久a级免费| 国产亚洲精品美女久久久久| 久色乳综合思思在线视频| 1769国产精品| 欧美性猛交xxxx免费看| zzjj国产精品一区二区| 亚洲欧美国产精品| 日韩在线观看免费高清| 中文字幕日韩综合av| 国产一区二区三区免费视频| 亚洲精品美女在线观看播放| 色琪琪综合男人的天堂aⅴ视频| 欧美日韩国产中文精品字幕自在自线| 92版电视剧仙鹤神针在线观看| 精品久久久久久| 久久久久久久久电影| 日本91av在线播放| 久久久久久久久久久久久久久久久久av| 久久久久久久久网站| 久久成年人免费电影| 欧美一级片在线播放| 国产成人精品综合| 91精品国产乱码久久久久久蜜臀| 国产亚洲精品美女| 91av在线免费观看| 亚洲男人天堂古典| 青青青国产精品一区二区| 国产一区二区三区精品久久久| 成人黄色免费看| 亚洲精品久久久一区二区三区| 2019亚洲日韩新视频| 欧美成人午夜激情| 国产一区视频在线播放| 91av在线精品| 欧美成人午夜激情视频| 97国产suv精品一区二区62| 亚洲视频电影图片偷拍一区| 久久久国产精品亚洲一区| 狠狠干狠狠久久| 久久激情五月丁香伊人| 中文字幕精品久久| 国产美女精彩久久| 欧美精品www在线观看| 亚洲人精选亚洲人成在线| 国产亚洲成精品久久| 国产精品美女免费视频| 欧美激情一级精品国产| 欧美高清在线视频观看不卡| 久久久www成人免费精品张筱雨| 久久久久www| 日韩在线激情视频| 国产成人精品日本亚洲专区61| 久色乳综合思思在线视频| 国内精品一区二区三区四区| 大胆人体色综合| 欧美日韩国产精品| 欧美午夜片在线免费观看| 久久精品久久久久久| 成人激情视频免费在线| xx视频.9999.com| 国产91色在线播放| 久久夜色撩人精品| 国产精品视频导航| 精品国产欧美一区二区三区成人| 国产精品久久9| 亚洲女人天堂色在线7777| 神马久久久久久| 91久热免费在线视频| 国产精品永久免费观看| 国产免费一区二区三区在线观看| 亚洲国产日韩欧美在线99| 精品成人乱色一区二区| 亚洲成人精品视频在线观看| 国产成+人+综合+亚洲欧美丁香花| 成人性生交大片免费观看嘿嘿视频| 上原亚衣av一区二区三区| 国产成人精品a视频一区www| 欧美性xxxxxxxxx| 欧美夫妻性视频| 亚洲男人的天堂网站| 亚洲精品国产免费| 91午夜在线播放| 欧洲永久精品大片ww免费漫画| 欧美老少配视频| 91精品视频观看| 中文字幕亚洲综合久久筱田步美| 欧美激情国产高清| 疯狂做受xxxx欧美肥白少妇| 91色琪琪电影亚洲精品久久| 日韩精品视频在线免费观看| 国产精品香蕉av| 久久6免费高清热精品| 成人乱人伦精品视频在线观看| 国产成+人+综合+亚洲欧美丁香花| 91在线观看欧美日韩| 日本精品一区二区三区在线| 日本高清不卡的在线| 国产视频999| 91沈先生作品| 欧美中文字幕在线播放| 国产91免费观看| 日韩av有码在线| 国产在线视频欧美| 国产欧美日韩免费看aⅴ视频| www.亚洲一二| 一区二区在线视频| 亚洲成人动漫在线播放| 精品日韩视频在线观看| 全色精品综合影院| 久久久国产精彩视频美女艺术照福利| 亚洲欧美激情精品一区二区| 一区二区三区天堂av| 美女av一区二区三区| 成人a在线视频| 国产精品女视频| 国产精品久久久久99| 久久视频国产精品免费视频在线| 国产精品旅馆在线| 国产精品美女av| 亚洲精品国产福利| 色伦专区97中文字幕| 亚洲三级黄色在线观看| 欧美俄罗斯性视频| 91亚洲精华国产精华| 亚洲午夜国产成人av电影男同| 欧美日韩在线免费观看| 欧美精品第一页在线播放| 视频在线观看一区二区| 欧美成人午夜激情| 欧美日韩国产成人在线| 国产精品高潮呻吟久久av无限| 亚洲男人第一av网站| 日韩大片免费观看视频播放| 精品日本美女福利在线观看| 欧美巨乳在线观看| 欧美丝袜美女中出在线| 国产精品大片wwwwww| 久久亚洲成人精品| 蜜臀久久99精品久久久久久宅男| 国产精品精品视频一区二区三区| 国产91在线播放九色快色| 国产精品高潮呻吟久久av野狼| 欧美精品成人91久久久久久久| 亚洲色图校园春色| 精品av在线播放| 亚洲综合在线中文字幕| 国产精品爱久久久久久久| 欧美成人精品一区| 国产精品激情av在线播放| 精品视频一区在线视频| 久久久噜噜噜久久中文字免| 亚洲国产日韩精品在线| 日韩电影在线观看永久视频免费网站| 中文字幕日韩av综合精品| 亚洲最大激情中文字幕| 91av在线网站| 亚洲免费av网址| 国产精品99久久久久久人| 国产精品video| 欧美裸体xxxx极品少妇|