0%

在使用异步的终极解决方案-ES7的async/await同时,如何优雅的处理错误提高代码的兼容性让作为码农的我很头疼。在项目实战中合理的使用try…catch…让代码的兼容和稳定性大大增强。

本文将对 try…catch… 分成三个方面来叙述。

  • 为什么要用
  • 如何使用
  • 实战

1、为什么要用 try…catch…

1
2
3
4
5
6
7
8
9
10
11
12
13
14
async function funcAsync(){
console.log('\n---begin---\n');
await ih_func();
console.log('------end-----');
}

function ih_func(){
return new Promise(function (resolve, reject) {
//这里相当于throw一个异常了
reject('error');
});
}

funcAsync();

运行结果

你一定会好奇为什么只打印了begin而没有打印end,这是因为reject(‘error’); 相当于throw一个异常了,所以程序就不会继续往下执行了,想要程序继续执行下去就需要处理throw出来的异常。

阅读全文 »

google服务

谷歌登录

谷歌登录只需要 clientId.客户端会获取到 idToken,发送给后端以后,后端拿 idToken请求谷歌,谷歌会解析出这个 Google 账号的信息,其中azp参数就是 clientId,与本地的 clientId 对比,校验这个账号是不是本应用登录的.是的话就创建账号或登录,返回账号信息给客户端.

谷歌支付

谷歌支付需要的参数:

  • clientId
  • clientSecret
  • googlePublicKey
  • 最麻烦的refreshToken

其中 clientId 和 clientSecret还有googlePublicKey在谷歌开发者后台可以拿到.
refreshToken 需要一连串的流程

阅读全文 »

redis

简介

简单的讲,redis 是一个非常高效的简单数据库,这个数据库只有5种数据结构.
因为 redis 具有速度快,可以设置过期时间的特性,常被用来做缓存.

数据结构

  1. string 字符串
  2. hash 多个键值对的集合
  3. set 集合
  4. sorted set 有序集合
  5. list 列表

基本命令

redis 的五种数据结构其实也都是键值对,区别在于键值对的值不一样,不一样的数据结构的值可能又是另一个键值对,或者是一系列的键值对.
但是就像 JavaScript 中所有的数据结构都是从 Object 类型继承来的一样,redis 也可以类比成这样.五种数据结构都继承于键值对,所以也会有一些通用的方法.

redis基本命令

阅读全文 »

在 Ubuntu 上安装 ss

0. 购买或者薅羊毛 vps

1. ssh 登录

2. 获取root权限

sudo -s

3. 更新apt-get

apt-get update

4. 安装python包管理工具

apt-get install python-setuptools
apt-get install python-pip

5. 安装ss

pip install shadowsocks

阅读全文 »

使用item2 + oh-my-zsh就自动支持 git 的命令缩写

以下是一些常用的缩写:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
alias ga='git add'
alias gb='git branch'
alias gba='git branch -a'
alias gbd='git branch -d'
// commit
alias gcam='git commit -a -m'
alias gcmsg='git commit -m'

alias gcb='git checkout -b'
alias gco='git checkout'
alias gcp='git cherry-pick'

alias gcl='git clone'
alias gd='git diff'
alias gfo='git fetch origin'
alias ggpush='git push origin $(git_current_branch)'
alias ggsup='git branch --set-upstream-to=origin/$(git_current_branch)'
alias glgp='git log --stat -p'

alias gm='git merge'
alias gp='git push'
alias gst='git status'
// 暂存
alias gstl='git stash list'
alias gsta='git stash save' // 可加注释 'this is xxx'
alias gstp='git stash pop' // 恢复后删除暂存 后面加 stash@{index}指定某个暂存
alias gstc='git stash clear' // 删除全部暂存
alias gstd='git stash drop' // stash${index} 指定删除某个暂存

用习惯以后,写 git 还是会快很多的

egg.js 笔记

内置对象

关于 app, ctx, helper, config, logger 的详细介绍:
官网链接

拓展

记一下经常容易弄错的 logger 对象

  • App Logger
    我们可以通过 app.logger 来获取到它,如果我们想做一些应用级别的日志记录,如记录启动阶段的一些数据信息,记录一些业务上与请求无关的信息,都可以通过 App Logger 来完成。

  • Context Logger
    我们可以通过 ctx.logger 从 Context 实例上获取到它,从访问方式上我们可以看出来,Context Logger 一定是与请求相关的,它打印的日志都会在前面带上一些当前请求相关的信息(如 [$userId/$ip/$traceId/${cost}ms $method $url]),通过这些信息,我们可以从日志快速定位请求,并串联一次请求中的所有的日志。

  • Controller Logger & Service Logger
    我们可以在 Controller 和 Service 实例上通过 this.logger 获取到它们,它们本质上就是一个 Context Logger,不过在打印日志的时候还会额外的加上文件路径,方便定位日志的打印位置。

由此可见,如果想看到http请求的参数和路径,还有打印logger的文件就使用this.logger(ctx.logger多一个文件路径),如果只是打印和请求无关的日志,使用app.logger

总结:

在 controller和service 里比较推荐使用 ctx.logger,这样可以获取当前请求的相关信息,比较容易定位 bug.
在其他和业务无关的地方用 app.logger 就好了

阅读全文 »

反向代理与正向代理

面试中经常会问到 Nginx 的反向代理是什么意思,理解这个问题首先要知道什么是正向代理,反向代理就是正向代理的反方向.

正向代理

客户端不直接访问服务器,而是访问代理服务器,代理服务器再去访问服务器,并把结果返回给客户端,这就是正向代理,**发起者也就是需要代理服务的客户端.**比如我们手机或者电脑需要访问外网,这个时候就需要一个能访问外网的代理服务器,也就是 SS 服务器,这个时候SS 对我们来说就是一个正向代理服务,我们访问 SS 服务器,它帮我们去访问外网,再把我们要的资料返回给我们.

阅读全文 »

JavaScript 中的定时任务

定时任务

一般在 node 中,执行定时任务的方式有:

  1. setTimeout
  2. schedule包
  3. 轮询 redis 或数据库
  4. 延时队列

setTimeout

setTimeout是最简单的办法.

1
setTimeout(callback(), time);
阅读全文 »

JavaScript 的错误捕获

异常类型

  1. EvalError,调用eval()时发生的异常,已被废弃只用于向后兼容而已
  2. InternalError,JavaScript引擎内部异常,FireFox独门提供的!
  3. RangeError,当函数实参越界时发生,如Array,Number.toExponential,Number.toFixed和Number.toPrecision时入参非法时。
  4. ReferenceError,当引用未声明的变量时发生
  5. SyntaxError,解析时发生语法错误
  6. TypeError,当值不是所期待的类型时,null.f()也报这个错
  7. URIError,当传递一个非法的URI给全局URI处理函数时发生,如decodeURIComponent(‘%’),即decodeURIComponent,decodeURI,encodeURIComponent,encodeURI
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
function promise1(i) {
return new Promise((resolve, reject) => {
console.log(i);
resolve('resolve promise1');
})
};

function promise2() {
return new Promise((resolve, reject) => {
console(2); // 这里是错误
})
};

function promise3() {
return new Promise((resolve, reject) => {
console.log(3);
resolve('resolve promise3');
})
};
阅读全文 »

kafka-node

kafka 是一个高吞吐的分布式发布订阅消息系统
当瞬发数据量非常庞大的时候,就可以使用 kafka 做消息队列, 由生产者把数据放入 kafka 服务的消息队列中,由 kafka 来控制调度消费者来消费掉这些数据,这个过程如果由 API 服务器直接做的话,很可能会因为并发量过大导致操作速度慢,甚至于宕机.

如果我们用 kafka 来控制这个过程,就会变的非常安全, kafka 的高吞吐量能够轻松容纳每秒数百万次的消息.

阅读全文 »