前言
由于工作需要,设计到了阿里云的弹性计算,这里便记录下来
技术栈
- 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) "htmlcode">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 = BaseServiceInqueryService
具体的业务逻辑
// 导入基类 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); };总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。