关于设计 webhook 的一些心得

webhook 的定义

来自于维基百科的定义

网络钩子是“用户定义的HTTP回调”。
网络钩子通常被某些事件激活,比如将代码推送到源或评论博客。
当此事件发生时,原网站将向为网络钩子配置的URL发送HTTP请求。用户可配置它们引发网页上的事件以调用另一个网站的行为。
此操作可为任何事件。网络钩子常用于激活持续集成系统的构建操作或用于提醒缺陷跟踪管理系统。
由于网络钩子使用HTTP,它们可以被无缝集成入网页服务而无需添加新的基础设施。

在笔者看来,通俗点来讲,当你的系统A想要接收系统B的一些事件消息,系统B定义了数据的格式,系统A需要在系统B中配置一个API,当系统B触发了系统A订阅的事件,则系统A配置的API会收到系统B的调用,从而进行其他逻辑的处理。

一般系统A提供的API是公网可以访问的,暴露在公网上意味着任何人都可以调用,那么就可能被别人伪造成系统B的请求,从而干一些危害系统的事情,所以一般系统B除了定义数据的格式,还要将如何验证来源是系统B的策略告知系统A,系统A再去验证来源,验证通过后,再处理其他的业务逻辑。

同时,系统A有可能有一段时间服务有异常,不能访问,那怎么保证数据不丢失,系统B在设计webhook时就还要考虑消息的确认和重试。

Read More

编程小技巧--试着编程时不用 if 语句

当我教初学者编程,并且向他们展示编程挑战的时候,我最喜欢的一个挑战是:不使用 if 语句或者 switch,三目表达式去解决相同的问题

你可能会问这有什么用处?

我认为这种挑战强迫你的大脑以不同的方式思考,不同的解决方案可能会更好。

使用 if 语句没有任何问题,但是避免它们有时会使代码对人更具可读性。这绝对不是通用的规则,因为有时候避免 if 语句会使代码的可读性降低很多。具体由你来决定。

避免 if 语句不只是关于可读性。这个概念背后有一些科学。正如下面的挑战所显示的那样,不使用 if 语句可以让您更接近代码即数据的概念,这为诸如在执行代码时修改代码等独特功能打开了大门!

在所有情况下,在不使用任何条件判断的情况下尝试解决编码的这类挑战很有趣。

以下是基于 if 的解决方案和不使用 if 的解决方案的一些示例性挑战。所有解决方案都是用 JavaScript 编写的。

告诉我你认为哪些解决方案更具可读性。

挑战#1:数出一个数组里面奇数的数量

假设我们有一个整数数组,我们想要计算这些整数中有多少是奇数。

以下是一个测试示例:

1
const arrayOfIntegers = [1, 4, 5, 9, 0, -1, 5];

这是一个使用 if 语句的解决方案:

1
2
3
4
5
6
7
8
let counter = 0;
arrayOfIntegers.forEach((integer) => {
const remainder = Math.abs(integer % 2);
if (remainder === 1) {
counter++;
}
});
console.log(counter);

这是一个不使用 if 语句的解决方案:

Read More

使用亚马逊的邮件服务(SES)发送邮件实战

本篇文章记录了本人使用 AWS 的 SES 发送邮件的心得,以下的操作都是基于 AWS 提供的SES 服务的文档,读者在使用 AWS 的邮件服务遇到困惑时,不妨阅读下本篇文章,希望会给你提供一些帮助。

Simple Email Service 简称 SES 是 AWS 的邮件服务,除了有基本的发送邮件的功能,还可以对邮件的事件进行监控,进而获取一些数据,用于以后的分析。 邮件事件分为以下几种:

  • 发送 – 对 Amazon SES 的调用已成功且 Amazon SES 将尝试发送电子邮件。
  • 拒绝 – Amazon SES 接受了电子邮件,并确定电子邮件中包含病毒,然后拒绝了电子邮件。Amazon
    SES 未尝试将电子邮件发送到收件人的邮件服务器。
  • 退回邮件 – 收件人的邮件服务器永久拒绝了电子邮件。此事件对应查无此人的邮件。只有当 Amazon
    SES 重试一段时间后仍无法发送邮件时才包括软退回邮件。
  • 投诉 – 已将电子邮件成功发送给收件人。收件人将电子邮件标记为垃圾邮件。
  • 送达 – Amazon SES 已将电子邮件成功送达至收件人的邮件服务器。
  • 打开 – 收件人收到了邮件并在其电子邮件客户端中打开了邮件。
  • 点击 – 收件人点击了电子邮件中包含的一个或多个链接。
  • 呈现失败 – 由于模板呈现问题,未发送电子邮件。此事件类型仅在您使用 SendTemplatedEmail 或
    SendBulkTemplatedEmail API 操作发送模板化电子邮件时发生。当模板数据丢失或模板参数与数据
    不匹配时,可能会发生此事件类型

如果是向用户发送营销邮件,则可以通过这些事件,监控到用户填写的邮箱是否正确、邮件是否成功的发送到用户的邮箱、用户有没有查看邮件、邮件里面附带的营销链接有没有被点过等,然后根据这些数据对邮件的内容进行调整,以达到最好效益。

Read More

到底什么是 Node.js

Node.js 是一个 JavaScript 运行时环境。听起来不错,但这意味着什么?这是如何运作的?

Node 运行时环境包含着执行 JavaScript 所编写的程序所需的一切。

nodejs runtime
Java 和 Node.js 的类比

当 JavaScript 的开发者,将 JavaScript 从浏览器开发拓展到本地计算机上开发时,Node.js 就出现了。

现在,您可以使用 JavaScript 做更多事情,而不仅仅是让网站可以互动。

JavaScript 现在能够执行其他脚本语言(如 Python)可以执行的操作。

浏览器的 JavaScript 和 Node.js 都在 V8 JavaScript 运行时引擎上运行。该引擎将 JavaScript 代码转换为更快的机器代码。机器代码是低级代码,计算机可以直接运行。

为什么选择 Node.js

这是官方 Node.js 网站上给出的正式定义:

Node.js® 是基于 Chrome 的 V8 JavaScript 引擎构建的 JavaScript 运行时。
Node.js 使用事件驱动的非阻塞 I/O 模型,使其轻量且高效。
Node.js 的包生态系统,npm,是世界上最大的开源库生态系统。

Read More

每个开发者应该了解的SOLID原则

面向对象的编程模式为软件开发带来了新的设计理念。

这使开发人员能够在一个类中组合具有相同目的/功能的数据,无论整个应用程序如何,这个类处理特定的事情。

但是,这种面向对象的编程还是不能预防写出令人困惑或不可维护的程序。

因此,Robert C. Martin制定了五项指导方针。 这五个准则/原则使开发人员可以轻松创建可读和可维护的程序。

这五个原则被称为S.O.L.I.D原则(首字母缩写词由Michael Feathers派生)。

  • S:Single Responsibility Principle 单一职责原则
  • O:Open-Closed Principle 开发-关闭原则
  • L:Liskov Substitution Principle 里氏替换原则
  • I:Interface Segregation Principle 接口隔离原则
  • D:Dependency Inversion Principle 依赖倒置原则

我们接下来会详细的讨论

注意: 本文中的大多数示例可能不足以满足实际需要或不适用于实际应用程序。 这一切都取决于您自己的设计和用例。 最重要的是要了解并知道如何应用/遵循原则

Single Responsibility Principle 单一职责原则

“…You had one job” — Loki to Skurge in Thor: Ragnarok
A class should have only one job.

一个类应该只负责一件事。 如果一个类有多个职责,那么它就会变得耦合。修改一项职责会导致要去修改另一项职责。

Read More

Node.js 面试总结

笔者前段时间(2018.09-2018.10)参加面试,地点深圳,面试的岗位是NodeJS后台开发,工作年限是1~3年,面过的公司有1000人以上的大公司,一百人左右的中等公司,及20~50的创业公司。

以下是一些对问到的问题的小结,希望对也要参加面试的朋友有些帮助,也欢迎补充。

文档的内容分为以下几部分:


技术类问题

主要分为JavaScript语言层面的、网络及规范、数据库、缓存、消息队列、开发流程等,有些问题相互交叉、水乳相融可能涉及到多项知识

Read More

Node.js 事件循环、定时器和process.nextTick()

本文为译文,英文原文

什么是事件循环

尽管JavaScript是单线程的,但通过尽可能将操作放到系统内核执行,事件循环允许Node.js执行非阻塞I/O操作。

由于现代大多数内核都是多线程的,因此它们可以处理在后台执行的多个操作。 当其中一个操作完成时,内核会告诉Node.js,以便可以将相应的回调添加到 轮询队列 中以最终执行。 我们将在本主题后面进一步详细解释。

事件循环解释

当Node.js启动时,它初始化事件循环,处理提供的输入脚本(或放入REPL,本文档未涉及),这可能会进行异步API调用,调度计时器或调用process.nextTick(), 然后开始处理事件循环。

Read More

浅谈node.js模块引入机制

之前笔者对nodejs中的模块是如何引入的也是一头雾水,读了一本《深入浅出nodejs》,加上自己工作时的经验和理解,有如下的总结,欢迎同仁指教~

前言

CommonJS的模块规范指出模块主要分为三部分:模块引用、模块定义、模块标识

模块引用

模块引用的示例代码如下:

1
const math = require('math')

在CommonJS规范中,存在require()方法,这个方法接受的参数为模块标识,以此引入一个模块的API到当前的上下文中。

模块定义

在模块中,上下文提供require()方法来引入外部模块。对应引入共能,上下文还提供了exports对象用于导出当前模块的方法或者变量。模块中还有一module对象,代表模块自身,exportsmodule对象的属性。在Node中,一个文件就是一个模块,将方法挂载在exports对象上作为属性即可定义导出的方式:

1
2
3
4
5
6
7
8
// math
exports.add = function add(...args) {
let sum = 0
args.forEach(i => {
sum += i
})
return sum
}

Read More

重置完阿里云要做的步骤(Ubuntu16.04)


增加新用户

创建新用户

1
sudo adduser username

其中username是你要创建的用户的名字,然后设置密码还有相关信息就可以了

赋予新用户sudo权限

用adduser创建后的新用户是不能使用sudo的,因为还没有赋予相关root权限,执行以下代码赋予权限

1
2
sudo usermod -a -G adm username
sudo usermod -a -G sudo username

删除用户

当需要删除用户时可以使用以下指令

1
sudo userdel -r username

这个指令会删除用户username并把该用户下的所有文件(/home/username/路径下的所有文件)都删除,若要保留这些文件而仅仅删除用户,可使用以下指令

1
sudo userdel username

安装nginx

安装NodeJS

https://nodejs.org/en/download/package-manager/#debian-and-ubuntu-based-linux-distributions

执行命令

1
2
curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash -
sudo apt-get install -y nodejs

安装MongoDB

https://owenlittlewhite.github.io/2018/08/30/mongodb-install-ubuntu/

编程rookie, 如有错误请指出 ☞:253065903@qq.com