国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

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

2019-11-19 12:09:43
字體:
來源:轉載
供稿:網友

前言

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

技術棧

  • 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);};

總結

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 乌恰县| 六安市| 黄陵县| 三河市| 沈丘县| 新邵县| 治县。| 富民县| 营山县| 夏津县| 葫芦岛市| 鲜城| 通榆县| 舟山市| 昆山市| 东港市| 凌海市| 渝中区| 璧山县| 绿春县| 苍溪县| 介休市| 个旧市| 原阳县| 张掖市| 常山县| 清流县| 西城区| 本溪市| 白水县| 石河子市| 屏东县| 翁牛特旗| 蕉岭县| 鄢陵县| 普兰县| 公主岭市| 亚东县| 蓬安县| 东辽县| 江西省|