背景 在 NodeJS web server 项目上,我们需要做登录验证,通过 用户名和密码 换取 token 是常用的方式。...header 是 token 的一部分,用来存放 token 的类型和编码方式,通常是使用 base-64 编码。 payload 包含了信息。你可以存放任一种信息,比如用户信息,产品信息等。...它们都是使用 base-64 编码方式进行存储。 signature 包括了 header,payload 和密钥的混合体。signature 必须安全地保存储在服务端。...; * sub: 该JWT所面向的用户,是否使用是可选的; * aud: 接收该JWT的一方,是否使用是可选的; * exp(expires): 什么时候过期,这里是一个Unix时间戳,是否使用是可选的...,比如几分钟;,是否使用是可选的; jsonwebtoken 介绍 它是 JWT 的 NodeJS 的一种实现。
在本教程中,我们将在服务器和客户端使用 TypeScript、React、NodeJS、Express 和 MongoDB 从头开始构建一个 Todo 应用程序。 我们从设计 API 开始。...用 NodeJS, Express, MongoDB 和 TypeScript 设计 API 启动 创建 Todo 类型 创建 Todo 模块 创建 API 控制器 获取、新增、更新和删除 Todo 创建...API 路由 创建服务器 用 React 和 TypeScript 创建客户端 启动 创建 Todo 类型 从 API 获取数据 创建组件 添加 Todo 表单 展示 Todo 获取和展示数据 资源...就是说,现在如果我们能成功连接 MongoDB,服务器就会启动,否则,会抛出错误。 我们现在已经通过 Node、Express、TypeScript 和 MongoDB 完成 api 的构建。...用 React 和 TypeScript 创建客户端 构建 为了创建一个新的 React 应用,我将会使用 create-react-app ——你可以用其他你想用的方法。
,最后决定使用的技术栈就是 koa+typescript+mysql+mongodb来搭建项目。...关于洋葱模型,大概归纳起来就是两点 context的保存和传递 中间件的管理和next的实现 ? (图片来源于网络) ?...Typescript 网上特别多关于“为什么要用Typescript开发”,“Typescript开发的好处和坏处”,“为什么不用Typescript开发”等等的争论和文章,有兴趣的同学也可以去说道说道哈...不过这个项目除了使用mysql,也还有用到mongo,接下来看看mongodb怎么用 使用mongoose作为mongodb的中间件 // mongoose入口 import mongoose from...jwt身份验证 这边使用jsonwebtoken来做jwt校验 import { sign, decode, verify } from 'jsonwebtoken' import { ParameterizedContext
写在最前面 使用 node 完成一个 todolist app 的 server 端,其中包括基本的 ts 配置方案和完成了 Models 和 Controler 层。...提示:需要对 Typescript 有一定了解,server 和 client 端均使用 Typescript 默认已经安装好 yarn或者npm 您可以按照顺序阅读 全栈 Todolist-server...yarn add typescript -g 安装 express 和 MongoDB 依赖和他们的 @types yarn add express cors mongoose yarn add...-D @types/node @types/express @types/mongoose @types/cors 安装用来编译 Typescript 的concurrently 和 nodemon...3、code(源码参考) 3.1 创建 todolist @types types/todo.ts import { Document } from "mongoose" export interface
使用Mongoose构建服务 该方式需要在本地安装MongoDB才可以 使用 TypeScript、Express、Mongoose 和 pnpm 可以快速构建后端服务,并实现增删改查以及列表查询的功能...express mongoose pnpm install --save-dev typescript ts-node nodemon @types/express @types/mongoose...Express 应用程序,并配置中间件和路由: import express from 'express'; import mongoose from 'mongoose'; import routes...删除用户:DELETE http://localhost:3000/users/{id} 请注意,这只是一个简单的示例,实际项目中可能需要更多的验证、错误处理和安全性措施。...使用内存数据库SQLite数据库 该方式无需安装数据库SQLite,使用的是内存数据库 以下步骤和之前的一样,不再做过多解释 mkdir backend cd backend pnpm init pnpm
使用Mongoose构建服务该方式需要在本地安装MongoDB才可以使用 TypeScript、Express、Mongoose 和 pnpm 可以快速构建后端服务,并实现增删改查以及列表查询的功能。...mongoosepnpm install --save-dev typescript ts-node nodemon @types/express @types/mongoose创建 TypeScript...例如,我们创建一个 User 模型:import mongoose from 'mongoose';const userSchema = new mongoose.Schema({ name: {...删除用户:DELETE http://localhost:3000/users/{id}请注意,这只是一个简单的示例,实际项目中可能需要更多的验证、错误处理和安全性措施。...使用内存数据库SQLite数据库该方式无需安装数据库SQLite,使用的是内存数据库以下步骤和之前的一样,不再做过多解释mkdir backendcd backendpnpm initpnpm install
该 versionKey 是每个文档首次创建时,由 mongoose 创建的一个属性。包含了文档的内部修订版。此文档属性是可配置的。默认值为__v。...这里我主要说一下versionKey和timestamps: versionKey(上文有提到) 是 Mongoose 在文件创建时自动设定的。这个值包含文件的内部修订号。...get: 函数,使用 Object.defineProperty() 定义自定义 getter set: 函数,使用 Object.defineProperty() 定义自定义 setter alias...,验证值是否匹配给定的正则表达式 enum: 数组,创建一个验证器,验证值是否是给定数组中的元素 数字 min: 数字,创建一个验证器,验证值是否大于等于给定的最小值 max: 数字,创建一个验证器,验证值是否小于等于给定的最大的值...user/pass:身份验证的用户名和密码。这是 mongoose 中特殊的选项,它们可以等同于 MongoDB 驱动中的auth.user和auth.password选项。
1.2 准备工作 1.首先你必须安装MongoDB和NodeJS 2.在项目只能够创建一个数据库连接,如下: var mongoose = require('mongoose'); //引用...(MDragon,callback); 两种新增方法区别在于,如果使用Model新增时,传入的对象只能是纯净的JSON对象,不能是由Model创建的实体,原因是:由Model创建的实体krouky虽然打印是只有...如果是使用Model创建的对象,传入时一定会将隐藏属性也存入数据库,虽然3.x追加了默认严格属性,但也不必要增加操作的报错 3.4 删除 和新增一样,删除也有2种方式,但Entity和Model都使用.../max 范围验证(边值验证) enum/match 枚举验证/匹配验证 validate 自定义验证规则 以下是综合案例: var PersonSchema = new Schema({...,避免异步操作的层层迭代嵌套 8.4 使用范畴 复杂的验证 删除有主外关联的doc 异步默认 某个特定动作触发异步任务,例如触发自定义事件和通知 例如,可以用来做自定义错误处理 schema.pre
创建集合 创建集合分为两步,-是对对集合设定规则,二是创建集合,创建mongoose.Schema构造函数的实例即可创建集合。...: String, author: String , isPub1ished: Boolean }); //3、使用规则创建集合 这里创建的集合也是一个构造函数 const Course...验证 在创建集合规则时,可以设置当前字段的验证规则,验证失败则插入失败。...}, // 自定义错误信息 message: '您输入的值不符合验证规则' } } }); // 使用规则创建集合 const Post...= new mongoose.Schema({ title: { type: String }, // 1、使用ID将文章集合和作者集合进行关联 author
5、mongoose验证 在创建集合规则时,可以设置当前字段的验证规则,验证失败就则输入插入失败。...数值最小为2 max: 100 数值最大为100 enum: [‘html’, ‘css’, ‘javascript’, ‘node.js’] trim: true 去除字符串两边的空格 validate: 自定义验证器...}, // 自定义错误信息 message: '传入的值不符合验证规则' } } }); const Post = mongoose.model...使用id对集合进行关联 使用populate方法进行关联集合查询 集合关联实现 // 用户集合 const User = mongoose.model('User', new mongoose.Schema...title: { type: String }, // 使用ID将文章集合和作者集合进行关联 author: { type: mongoose.Schema.Types.ObjectId
验证 在创建集合规则时,可以设置当前字段的验证规则,验证失败则插入失败。...}, // 自定义错误信息 message: '您输入的值不符合验证规则' } } }); // 使用规则创建集合 const Post...使用id对集合进行关联 使用populate方法进行关联集合查询 // 关联集合 const mongoose = require('mongoose'); // 连接数据库 mongoose.connect...= new mongoose.Schema({ title: { type: String }, // 1、使用ID将文章集合和作者集合进行关联 author...案例:用户信息增删改查 搭建网站服务器,实现客户端与服务器端的通信 连接数据库,创建用户集合,向集合中插入文档 当用户访问/list时, 将所有用户信息查询出来 将用户信息和表格HTML
通过这种方式,您可以灵活地注入“兼容的依赖项”,例如,当您为服务编写单元测试时,或者在其他上下文中使用服务时。 没有 DI 的代码 import UserModel from '.....重构它的每个实例化是一项乏味且容易出错的任务。...这就是创建依赖注入框架的原因。 这个想法是在类中定义你的依赖,当你需要一个类的实例时只需要调用 “Service Locator” 即可。...通过使用依赖项注入和这些组织模式,单元测试变得非常简单。 你不必模拟 req/res 对象或 require(...) 调用。...使用 Pub/Sub 模式并为后台任务触发事件。 进行依赖注入,让您高枕无忧。 切勿泄漏您的密码、机密和 API 密钥,请使用配置管理器。
npm run dev $ open http://localhost:7001 image.png 安装插件 @switchdog/egg-graphql 插件机制是egg的一大特色,由于我们基于 TypeScript...使用浏览器打开该可见。...graphiql: true, apolloServerOptions: { tracing: true, // 设置为true时,以Apollo跟踪格式收集和公开跟踪数据...使用 graphql 或 rest 端点时,实际上不必担心使用 CSRF 保护。对服务的请求应该是无状态的,并且不真正依赖Cookie或会话数据。...在定义字段时需要注明类型,这也是 graphql 的特点之一,是支持强类型的。如果非空,就在类型后面跟上一个!号。graphql 还包括枚举类型,列表和自定义类型。
(英) 除了使用媒体查询和flexbox和grid之类的现代CSS布局创建响应网站之外,本文介绍了HTML特性和CSS的新函数minimum,clamp等来实现响应式。...英) Brahmos是一个使用现代React API和本机模板构建用户界面的库,具有轻巧快速,使用jsx语法编写(但是源码占用空间相比jsx更小),并且没有使用VDOM的特性。...https://inspect.dev/ Mongoose 5.10新增乐观并发控制(乐观锁)(英) Optimistic concurrency核心思想是追踪文档的版本并在每次保存后增加版本,当在加载文档和保存文档之间...Optimistic concurrency可以有效的保证依赖于多个属性的逻辑验证,确保其具有一致的数据视图。...相反,可以在下一次提交时解决违反准则的情况。 https://developer.apple.com/news/?
背景:1)任何一个Python程序文件既可以直接执行,也可以作为模块导入再使用其中的对象;2)对于大型系统开发,一般不会把所有代码放到单个文件中,而是根据功能将其分类并分散多个模块中,在编写小型项目时最好也能养成这样的好习惯...本文介绍Python自定义模块中对象的导入和使用。...假设当前工作目录为C:\Python36,创建一个子目录child,然后在其中创建一个Python程序文件add.py,其中的代码为: def add(x, y): return x+y 这时,文件夹结构如图所示...继续执行下面的代码: >>> import child.add >>> child.add.add(3,5) 8 自定义模块中的对象成功被导入并能够正常使用,也就是说,如果要使用的对象在子模块中,应该单独使用...原因在于,如果文件夹作为包来使用,并且其中包含__init__.py文件时,__init__.py文件中的特殊列表成员__all__用来指定from ... import *时哪些子模块或对象会被自动导入
篇(Cloud MongoDB) Todolist-client 篇(React Typescript) 0、注册使用 MongoDB Atles www.mongodb.com/cloud/atlas...注册或者登陆,可以使用 google 账号或者邮箱注册登陆。...一、创建集群 1、选择创建 ? 2、咋们选择免费的集群 tab ? 3、所有的都默认选择即可 AWS 和 美国的服务器 ? 4、配置完以后,正式创建集群 ?...二、Database Access 数据库用户配置 5、选择创建新用户 ? 6、用户管理者配置 选择 ==password== 模式,用户名和密码,下面有随机密码的选项,使用后建议复制一下保存下来。...app.ts import express, { Express } from 'express'; import mongoose from 'mongoose'; import cors from
Object.defineProperty()定义自定义getter set:同上 alias:别名 索引相关 可以使用 schema type定义索引相关 index:布尔值 是否对这个属性创建索引...unique:布尔值 是否对这个属性创建唯一索引 sparse:布尔值 是否对这个属性创建稀疏索引 四、Connections-连接 可以使用 mongoose.connect()连接...MongoDB,默认端口27017 操作缓存 就是说不必等待上面的connect连接成功后,就可以使用创建的 Mongoose models 禁用缓存,要修改 bufferCommands配置,mongoose.set...它们的实例就代表着可以从数据库保存和读取的 documents。 从数据库创建和读取 document 的所有操作都是通过 model 进行的。...findAndUpdate() 和 Query 中间件使用注意 pre 和 post save()钩子都不执行于 update()、 findOneAndUpdate()等情况 mongoose4.
Nest还通过依赖注入的形式实现了控制反转,只要声明模块中的依赖,Nest就会在启动的时候去创建依赖,然后自动注入到相应的地方。...Nest还践行了面向切面编程的思想,除了Middleware外,还有Exception Filter、Pipes、Guards和Interceptors几个预定义的切面,可以集中进行异常处理、数据验证、...权限验证和逻辑扩展等功能。...类型系统是后端开发很重要的一环,Nest是使用TypeScript实现的框架,因此原生就支持TypeScript,而且还大量使用了注解,熟悉 Spring 的朋友会感到十分亲切。...连接数据库 例子中使用mongoose连接和操作本地MongoDB数据库。为了更方便使用,Nest提供了@nestjs/mongoose包,对mongoose包装了一层,使其更符合Nest的使用风格。
1.MongoDB增删改查操作 1.1 创建集合 创建集合分为两步,一是对对集合设定规则,二是创建集合,创建mongoose.Schema构造函数的实例即可创建集合。...: Boolean }) // 使用规则创建集合 // 1.集合名称 // 2.集合规则 const Course = mongoose.model('Course', courseSchema);...mongoose验证 在创建集合规则时,可以设置当前字段的验证规则,验证失败就则输入插入失败。...}, // 自定义错误信息 message: '传入的值不符合验证规则' } } }) const post = mongoose.model...使用ID将文章集合和作者集合进行关联 author: { type: mongoose.Schema.Types.ObjectId, ref: 'User' } })); //联合查询 Post.find
: Boolean }); //使用创建集合 创建构造函数 const Course = mongoose.model('Course', courseSchema) //courses //创建文档...: Boolean }); //使用创建集合 创建构造函数 const Course = mongoose.model('Course', courseSchema) //courses //创建文档..., hobbies: [String] }); // 使用规则创建集合 const User = mongoose.model('User', userSchema); // 查询用户集合中的所有文档...hobbies: [String] }); // 使用规则创建集合 const User = mongoose.model('User', userSchema); // 查找到一条文档并且删除...// false 验证失败 // v 要验证的值 return v && v.length > 4 }, // 自定义错误信息 message: '传入的值不符合验证规则' } }
领取专属 10元无门槛券
手把手带您无忧上云