Nestjs 身份验证策略 LocalAuth + JwtAuth

本文通过使用 LocalAuth 进行身份验证,身份确认后,使用 JwtAuth 颁发身份令牌以及验证身份令牌的有效性。

LocalAuth

Passport 提供了一种名为 passport-local 的策略,它实现了使用用户名/密码的身份验证机制。

首先安装需要的包:

1
2
npm install --save @nestjs/passport passport passport-local
npm install --save-dev @types/passport-local
Read More

如何在 node 中运行 esm 模块

我们都知道前端有两种常见的模块化规范,一种是 ES6 模块 简称 ESM,一种是 Node.js 专用的 CommonJS 模块 简称 CJS,两者是不兼容的。

我最近在写 node 项目,整个项目是用 @nest/cli 起的,文件模块默认用的是 ESM。为了快捷验证我的爬虫,想直接在 node REPL 环境中单独运行,但总是报错。

Read More

从 reflect metadata 理解 Nest 的实现原理

依赖注入

Nest 是 Node.js 的服务端框架,它最出名的就是 IOC(inverse of control) 机制了,也就是不需要手动创建实例,框架会自动扫描需要加载的类,并创建他们的实例放到容器里,实例化时还会根据该类的构造器参数自动注入依赖。

它一般是这样用的:

比如入口 Module 里引入某个模块的 Module:

1
2
3
4
5
6
7
import { Module } from "@nestjs/common";
import { CatsModule } from "./cats/cats.module";

@Module({
imports: [CatsModule],
})
export class AppModule {}
Read More

一文详解小程序授权、登录、session_key 和 unionId

微信应用的一个很大的优势就在于使用过程中是不需要进行注册和显式登录的,大部分问题基本上可以一键解决。但是在授权、登录和获取用户信息的过程中都发生了哪些事情,今天我们就来讨论一下。这篇文章主要分析以下几个问题:

  1. 授权和登录的意义
  2. session_key 的作用
  3. unionId 的作用,有哪些获取途径
  4. 在应用中如何保存用户登录态
Read More

python 进阶(三)守护线程

在创建新线程时,子线程会从其父线程继承其线程属性,主线程是普通的非守护线程,默认情况下,它所创建的任何线程都是非守护线程。本文将介绍 Python 中的另一类后台线程,守护线程(Daemon Thread)

无法退出的主线程

我们经常需要创建线程来执行某项例行任务或提供某种特殊服务,常见的例子就是垃圾收集器。垃圾收集器是一种自动内存管理器,它在后台运行并尝试回收程序不再使用的垃圾内存。许多语言都将垃圾收集都作为其运行时环境的标准部分。

Read More

python 进阶(二)queue

生产者消费者模型

在并发编程中,比如爬虫,有的线程负责爬取数据,有的线程负责对爬取到的数据做处理(清洗、分类和入库)。假如他们是直接交互的,那么当二者的速度不匹配时势必出现等待现象,这也就产生了资源的浪费。

抽象是一种很重要的通用能力,而生产者消费者模型是前人将一系列同类型的具体的问题抽象出来的一个一致的最佳解决方案。

该模型有三个重要角色,容器生产者消费者,顾名思义,生产者就是负责生产数据或任务的,消费者就是负责消费数据或者任务的(下文统称为任务),容器是二者进行通讯的媒介。

Read More

python 进阶(一)asyncio

python 中协程概念是从 3.4 版本增加的,但 3.4 版本采用是生成器实现,为了将协程和生成器的使用场景进行区分,使语义更加明确,在 python 3.5 中增加了asyncawait关键字,用于定义原生协程。

asyncio 异步 I/O 库

python 中的 asyncio 库提供了管理事件、协程、任务和线程的方法,以及编写并发代码的原语,即asyncawait

Read More

写一个自己的webpack plugin

想必大家都用过 webpack,也或多或少了解它的原理,但是不知道大家有没有写过 Webpack 的插件呢?

今天我们就一起来写一个划分 Chunk 的 webpack 插件吧,写完后你会发现想怎么分 Chunk 都可以!

首先我们简单了解下 webpack 的原理:

Read More

React hooks 源码解析

本文将讲解 hooks 的执行过程以及常用的 hooks 的源码。

hooks 相关数据结构

要理解 hooks 的执行过程,首先想要大家对 hooks 相关的数据结构有所了解,便于后面大家顺畅地阅读代码。

Hook

每一个 hooks 方法都会生成一个类型为 Hook 的对象,用来存储一些信息,前面提到过函数组件 fiber 中的 memoizedState 会存储 hooks 链表,每个链表结点的结构就是 Hook。

1
2
3
4
5
6
7
8
9
// packages/react-reconciler/src/ReactFiberHooks.old.js

export type Hook = {|
memoizedState: any, // 上次渲染时所用的 state
baseState: any, // 已处理的 update 计算出的 state
baseQueue: Update<any, any> | null, // 未处理的 update 队列(一般是上一轮渲染未完成的 update)
queue: UpdateQueue<any, any> | null, // 当前出发的 update 队列
next: Hook | null, // 指向下一个 hook,形成链表结构
|};
Read More

为什么React和Vue都选择了Hooks

hooks: 什么叫大势所趋?

2019 年年初,react16.8.x 版本正式具备了 hooks 能力。

2019 年 6 月,尤雨溪在 vue/github-issues 里提出了关于 vue3 Component API 的提案。(vue hooks 的基础)

在后续的 reactvue3 相关版本中,相关 hooks 能力都开始被更多人所接受。

Read More