ノードチュートリアル-APIインターフェース開発(MangoDB + Express)

gitソースコード

注:ソースコードはgithubにアップロードされており、ウェアハウスアドレスはhttps://github.com/BM-laoli/Node-api-Designです 

モジュール依存関係グラフ

1.概要

  • 概要:
    アーキテクチャーについて
    1. まず、ルートルートの開始点であるapp.jsがあります。これは、最初に
      その機能に入るのに使用され
      ます
      。1.1 基本的なWebサイトサーバーを作成するモジュールのインポート1.2 bodyPasserのインポート、ポストリクエストのフィルターと処理
      1.3データベース接続のインポート
      1.4ルートを開く

    2. これがルートフォルダにある別のmain.jsです。2.1
      何をする必要がありますか?ここで2番目のインターセプトを実行してからルーティングを配布します。2.22
      つのロジック処理モジュールを導入します。リクエストが送信されたときに、ログインでない場合は、トークンを検証する必要があり
      ます。2.3ログインにアクセスしている場合は、検証を処理するために投稿データを送信し、トークンを取得する必要があります
      。2.4トークンがある場合は、2.2ここにログインしていない他のルーティングパスにアクセスしてください。検証は合格、さまざまなインターフェースを割り当てることができます

    3. 詳細な説明支援、ツールコード
      3.1メインラインロジックで必要ないくつかのツールです
      3.2ミドルウェアミドルウェア、2つのツールがあります。1つはトークンと検証トークンを生成することです
      3.3 3.2の機能はモデルに依存する必要がありますutilの下のjwtツールは2つのキーペアに基づいてトークンを生成します
      3.4データベースリンクを作成するコンテンツ、初期化データを作成するコンテンツ、および開発データ操作オブジェクトの2つのツールもあります

2、ディスプレイインターフェイスAPIドキュメント

1.1ログイン

リクエストアドレス リクエスト方法
/ main / login 役職
パラメータ名 必要です パラメータの説明
Eメール はい メールボックス
パスワード はい パスワード
{
	"status": 200,
	"msg": "登陆成功",
	"token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJkYXRhIjoiNWU5MTIwMTViOWI0NmYzZmE4Y2MzMjUzIiwiZXhwIjoxNTg2OTUyMzk1LCJpYXQiOjE1ODY5NTA1OTV9.IsprCaQ_gZRh0BzS8SnAd0iJ27BOpOEb-ZGn0bTlwHVPTiYPK50wiEOL_0aAYINfNT_Mfvb726l3CpiHG9lsJ45m4eqhPeJz9TbAeQj8-ST3CAkYLrD0fhgRG9YiQ5kjVpygdR8NZEWEUV7ux-moyYe7wCoVzN9mbvAkFF3IYG0" } 

1.2トークンでテストする

リクエストアドレス リクエスト方法
/ main / text 取得する
パラメータ名 必要です パラメータの説明
トークン はい トークンを添付する必要があります。リクエストヘッダー内
なし なし インターフェイスはパラメータを渡す必要はありません
{
	"status": 200,
	"msg": "登陆成功"
}

注:上記は、ノード書き込みインターフェースの最も基本的な内容です。このコンテンツのインターフェースをさらに拡張できます

次に、app.jsモジュールの詳細な説明

app.js

//引入模块,创建简单服务器
const express = require('express');
//引入路径处理模块 const path = require('path'); //引入注意使用第三方模块处理post const bodyPaser = require('body-parser') // 引入数据库连接 不需要返回值 require('./model/content') //创建服务器 const app = express(); /*//初始化数据库,注意reque的时候 会自动执行引入的js文件 require('./model/create') */ //前往小心这个要放在所有的use前面,解析我们的post请求数据 app.use(bodyPaser.urlencoded({ extended: false })); //处理静态资源路径 const DataPath = path.join(__dirname, 'public'); //这个我们后面是有用的,用来操作媒体数据,最重要的就是这个路径还有这个静态资源对象 const StaticUtils = express.static(path.join(__dirname, 'public')); //拿到路由操作对象 const main = require('./route/mian/main'); //开放接口路径 //拦截请求开始匹配路由 app.use('/dataPath', (req, res) => { res.status(200).send(JSON.stringify({ 'dataPath': DataPath })) }) app.use(StaticUtils); app.use('/main', main) //监听端口 app.listen(3000) console.log('服务器开启'); 

3番目に、main.jsセカンダリルーティングインターセプトモジュール

main.js

const express = require('express')

//业务逻辑
const guard = require('../../Middleware/loginGuard') const loginPash = require('../../Middleware/loginPash') //创建路由对象 const admin = express.Router() //验证token admin.use(loginPash) //登录路由处理 admin.post('/login', guard) //首先要验证,然后才是放行到对应的路由接口里面取 admin.get('/text', require('./API/home/index')) module.exports = admin; 
  • シンプルなテストモジュールが搭載されています(このモデルをフォローし、APIインターフェイス関数モジュールをさらに記述できます)
    home / index.js
module.exports = async(req, res) => {
    res.send({ status: 200, msg: '登陆成功', }); } 

第四に、補助ツール(強調!!!)

  • データベース接続、設計、および初期作成モジュール
    モデル/ content.js &&モデル/ create.js

const mongoose = require('mongoose');

mongoose.connect('mongodb://localhost/blog')
    .then(() => { console.log('数据库连接成功'); }) .catch((erro) => { console.log(erro); }) 
 const mongoose = require('mongoose');

 const bcrypt = require('bcrypt') /*使用MongDB数据库,设计数据第一步(代码角度分析) 1.设定规则,Schema构造器,Schema的构造函数就是规则,注意规则是一系列对象 2.创建数据 */ const userSchema = new mongoose.Schema({ username: { type: String, required: true, min: 2, max: 10 }, email: { type: String, //注意 我们的邮箱凭据是用户登录的令牌,我们需要指定他为唯一的 unique: true, //这个时候,在插入的时候如果有重复的就给你抱一个错误 }, password: { type: String, required: true, }, role: { //需要说明一下,这个地方角色,我们硬性规定,超级管理员是admin普通用户是normal,为什么不用01?因为这里string了 type: String, required: true }, state: { //我们使用O1状态来设计这个数据字段,默认值是0。0是启用状态 type: Number, default: 0 } }) //使用规则创建集合, //一定要注意,我们的User就是代表了我目前最user数据集合,后期的增删改查我们都需要用到这个东西,所有我们暴露出去给路由业务使用 const User = mongoose.model('User', userSchema) //我们再来复习一下,如何用同步的方式获取异步的api结果?使用async 还有awit就可以 async function createUser() { const salt = await bcrypt.genSalt(10) const pass = await bcrypt.hash('123456', salt) const user = await User.create({ username: 'lli', email: '[email protected]', password: pass, role: 'admin', state: 0, }) } // createUser() /* // 初始化用户,注意我们的create返回的是一个promies User.create({ username: 'bmlaoli', email: '[email protected]', password: '123456', role: 'admin', state: 0, }) .then(() => { console.log('用户创建成功'); }) .catch((error) => { console.log('用户创建失败'); })*/ //注意啊,es6中如果键值对的名字是一样的就可以省略值。由于我们后期还会做更多的数据集合,于是乎我这里需要暴露一个对象出去 module.exports = { User } 
  • トークンを作成するためのもう1つの重要なツールモジュール
    は、フォルダー内の2つのキーペアファイルjwt.jsに基づいています


/*
 *描述:以下是jwt工具,生成用于访问验证的token 
 */

// 引入模块依赖
const fs = require('fs'); const path = require('path'); const jwt = require('jsonwebtoken'); // 创建 token 类 class Jwt { constructor(data) { this.data = data; } //生成token generateToken() { let data = this.data; let created = Math.floor(Date.now() / 1000); let cert = fs.readFileSync(path.join(__dirname, '../../pem/private_key.pem')); //私钥 可以自己生成,注意这里要使用 密钥对,请求百度下载,两对密钥对 let token = jwt.sign({ data, exp: created + 60 * 30, }, cert, { algorithm: 'RS256' }); return token; } // 校验token verifyToken() { let token = this.data; let cert = fs.readFileSync(path.join(__dirname, '../../pem/public_key.pem')); //公钥 可以自己生成 let res; try { let result = jwt.verify(token, cert, { algorithms: ['RS256'] }) || {}; let { exp = 0 } = result, current = Math.floor(Date.now() / 1000); if (current <= exp) { res = result.data || {}; } } catch (e) { res = 'err'; } return res; } } module.exports = Jwt; 
  • 次は、2つの特定のトークン検証関数モジュールです。
    ミドルウェアフォルダー
    loginGuard.js && loginPash.jsに配置します
const JwtUtil = require('../model/util/jwt')
const { User } = require('../model/create') const bcrypt = require('bcrypt') const guard = async(req, res, next) => { //注意使用第三方模块处理post //进图具体的业务逻辑,解构出来我们需要的东西 const { email, password, _id } = req.body; //注意啊,由于我们的中间件处理的请求于是乎我们的req身上就有这个处理的所有数据了,这个之前有说过 console.log(req.body); if (email.trim().length == 0 || password.trim().length == 0) { res.status(400).send( JSON.stringify({ message: '邮箱或密码错误' }) ) //注意send自动把状态码设置成了200,所以你需要改一下 return } //如果用户存在就先找到这个用户额信息,注意这里的这个异步await let user = await User.findOne({ email }); //这里的user就是指向当前查询出来的数据文档对象 if (user) { //比对操作,第一个参数是一个明文密码,第二个参数我们查询出来的加密密码 ,方法返回一个Boolean值,对比成功就是true,异步api可以直接加await const isValid = await bcrypt.compare(password, user.password) if (isValid) { //用户校验成功,添加tooken // 登陆成功,添加token验证 let _id = user._id.toString(); // 将用户id传入并生成token let jwt = new JwtUtil(_id); let token = jwt.generateToken(); // 将 token 返回给客户端 res.send({ status: 200, msg: '登陆成功', token: token }); //校验成功就 next() } else { res.status(400).send( JSON.stringify({ message: '邮箱或密码错误' }) ) } } else { res.status(400).send( JSON.stringify({ message: '邮箱或密码错误' }) ) } } module.exports = guard 

loginPash.js


const JwtUtil = require('../model/util/jwt')





//验证token
const loginPash = function(req, res, next) { // 我这里知识把登陆和注册请求去掉了,其他的多有请求都需要进行token校验 if (req.url != '/login?') { let token = req.headers.token; let jwt = new JwtUtil(token); let result = jwt.verifyToken(); // 如果考验通过就next,否则就返回登陆信息不正确 if (result == 'err') { console.log(result); console.log(req.url); res.send({ status: 403, msg: '登录已过期,请重新登录' }); // res.render('login.html'); } else { next(); } } else { next(); } }; module.exports = loginPash; 

5.最後に、これらのモジュール間の関係を整理します

実際、このインターフェースのセットはダウンしており、鶏肉を比較して、2日間の空き時間を費やしました。インターフェースのデザインにはあまり触れなかったため、バックグラウンドのデザインパターンやコンセプトについてはあまり知りませんでした。私が書いたのは、2,000行を超える3つのメモを書き、形が整う前に変更を繰り返したということです。上司が指を上げて迷路を指摘してくれることを願っています。また、この紹介文書があなたに利益をもたらすことを願っています。ここのモデルを使用して、より多くのインターフェースを開発します。しばらくお待ちください。

  • 各モジュールの参照関係、ユースケース図

gitソースコード

注:ソースコードはgithubにアップロードされており、ウェアハウスアドレスはhttps://github.com/BM-laoli/Node-api-Designです 

モジュール依存関係グラフ

1.概要

  • 概要:
    アーキテクチャーについて
    1. まず、ルートルートの開始点であるapp.jsがあります。これは、最初に
      その機能に入るのに使用され
      ます
      。1.1 基本的なWebサイトサーバーを作成するモジュールのインポート1.2 bodyPasserのインポート、ポストリクエストのフィルターと処理
      1.3データベース接続のインポート
      1.4ルートを開く

    2. これがルートフォルダにある別のmain.jsです。2.1
      何をする必要がありますか?ここで2番目のインターセプトを実行してからルーティングを配布します。2.22
      つのロジック処理モジュールを導入します。リクエストが送信されたときに、ログインでない場合は、トークンを検証する必要があり
      ます。2.3ログインにアクセスしている場合は、検証を処理するために投稿データを送信し、トークンを取得する必要があります
      。2.4トークンがある場合は、2.2ここにログインしていない他のルーティングパスにアクセスしてください。検証は合格、さまざまなインターフェースを割り当てることができます

    3. 詳細な説明支援、ツールコード
      3.1メインラインロジックで必要ないくつかのツールです
      3.2ミドルウェアミドルウェア、2つのツールがあります。1つはトークンと検証トークンを生成することです
      3.3 3.2の機能はモデルに依存する必要がありますutilの下のjwtツールは2つのキーペアに基づいてトークンを生成します
      3.4データベースリンクを作成するコンテンツ、初期化データを作成するコンテンツ、および開発データ操作オブジェクトの2つのツールもあります

2、ディスプレイインターフェイスAPIドキュメント

1.1ログイン

リクエストアドレス リクエスト方法
/ main / login 役職
パラメータ名 必要です パラメータの説明
Eメール はい メールボックス
パスワード はい パスワード
{
	"status": 200,
	"msg": "登陆成功",
	"token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJkYXRhIjoiNWU5MTIwMTViOWI0NmYzZmE4Y2MzMjUzIiwiZXhwIjoxNTg2OTUyMzk1LCJpYXQiOjE1ODY5NTA1OTV9.IsprCaQ_gZRh0BzS8SnAd0iJ27BOpOEb-ZGn0bTlwHVPTiYPK50wiEOL_0aAYINfNT_Mfvb726l3CpiHG9lsJ45m4eqhPeJz9TbAeQj8-ST3CAkYLrD0fhgRG9YiQ5kjVpygdR8NZEWEUV7ux-moyYe7wCoVzN9mbvAkFF3IYG0" } 

1.2トークンでテストする

リクエストアドレス リクエスト方法
/ main / text 取得する
パラメータ名 必要です パラメータの説明
トークン はい トークンを添付する必要があります。リクエストヘッダー内
なし なし インターフェイスはパラメータを渡す必要はありません
{
	"status": 200,
	"msg": "登陆成功"
}

注:上記は、ノード書き込みインターフェースの最も基本的な内容です。このコンテンツのインターフェースをさらに拡張できます

次に、app.jsモジュールの詳細な説明

app.js

//引入模块,创建简单服务器
const express = require('express');
//引入路径处理模块 const path = require('path'); //引入注意使用第三方模块处理post const bodyPaser = require('body-parser') // 引入数据库连接 不需要返回值 require('./model/content') //创建服务器 const app = express(); /*//初始化数据库,注意reque的时候 会自动执行引入的js文件 require('./model/create') */ //前往小心这个要放在所有的use前面,解析我们的post请求数据 app.use(bodyPaser.urlencoded({ extended: false })); //处理静态资源路径 const DataPath = path.join(__dirname, 'public'); //这个我们后面是有用的,用来操作媒体数据,最重要的就是这个路径还有这个静态资源对象 const StaticUtils = express.static(path.join(__dirname, 'public')); //拿到路由操作对象 const main = require('./route/mian/main'); //开放接口路径 //拦截请求开始匹配路由 app.use('/dataPath', (req, res) => { res.status(200).send(JSON.stringify({ 'dataPath': DataPath })) }) app.use(StaticUtils); app.use('/main', main) //监听端口 app.listen(3000) console.log('服务器开启'); 

3番目に、main.jsセカンダリルーティングインターセプトモジュール

main.js

const express = require('express')

//业务逻辑
const guard = require('../../Middleware/loginGuard') const loginPash = require('../../Middleware/loginPash') //创建路由对象 const admin = express.Router() //验证token admin.use(loginPash) //登录路由处理 admin.post('/login', guard) //首先要验证,然后才是放行到对应的路由接口里面取 admin.get('/text', require('./API/home/index')) module.exports = admin; 
  • シンプルなテストモジュールが搭載されています(このモデルをフォローし、APIインターフェイス関数モジュールをさらに記述できます)
    home / index.js
module.exports = async(req, res) => {
    res.send({ status: 200, msg: '登陆成功', }); } 

第四に、補助ツール(強調!!!)

  • データベース接続、設計、および初期作成モジュール
    モデル/ content.js &&モデル/ create.js

const mongoose = require('mongoose');

mongoose.connect('mongodb://localhost/blog')
    .then(() => { console.log('数据库连接成功'); }) .catch((erro) => { console.log(erro); }) 
 const mongoose = require('mongoose');

 const bcrypt = require('bcrypt') /*使用MongDB数据库,设计数据第一步(代码角度分析) 1.设定规则,Schema构造器,Schema的构造函数就是规则,注意规则是一系列对象 2.创建数据 */ const userSchema = new mongoose.Schema({ username: { type: String, required: true, min: 2, max: 10 }, email: { type: String, //注意 我们的邮箱凭据是用户登录的令牌,我们需要指定他为唯一的 unique: true, //这个时候,在插入的时候如果有重复的就给你抱一个错误 }, password: { type: String, required: true, }, role: { //需要说明一下,这个地方角色,我们硬性规定,超级管理员是admin普通用户是normal,为什么不用01?因为这里string了 type: String, required: true }, state: { //我们使用O1状态来设计这个数据字段,默认值是0。0是启用状态 type: Number, default: 0 } }) //使用规则创建集合, //一定要注意,我们的User就是代表了我目前最user数据集合,后期的增删改查我们都需要用到这个东西,所有我们暴露出去给路由业务使用 const User = mongoose.model('User', userSchema) //我们再来复习一下,如何用同步的方式获取异步的api结果?使用async 还有awit就可以 async function createUser() { const salt = await bcrypt.genSalt(10) const pass = await bcrypt.hash('123456', salt) const user = await User.create({ username: 'lli', email: '[email protected]', password: pass, role: 'admin', state: 0, }) } // createUser() /* // 初始化用户,注意我们的create返回的是一个promies User.create({ username: 'bmlaoli', email: '[email protected]', password: '123456', role: 'admin', state: 0, }) .then(() => { console.log('用户创建成功'); }) .catch((error) => { console.log('用户创建失败'); })*/ //注意啊,es6中如果键值对的名字是一样的就可以省略值。由于我们后期还会做更多的数据集合,于是乎我这里需要暴露一个对象出去 module.exports = { User } 
  • トークンを作成するためのもう1つの重要なツールモジュール
    は、フォルダー内の2つのキーペアファイルjwt.jsに基づいています


/*
 *描述:以下是jwt工具,生成用于访问验证的token 
 */

// 引入模块依赖
const fs = require('fs'); const path = require('path'); const jwt = require('jsonwebtoken'); // 创建 token 类 class Jwt { constructor(data) { this.data = data; } //生成token generateToken() { let data = this.data; let created = Math.floor(Date.now() / 1000); let cert = fs.readFileSync(path.join(__dirname, '../../pem/private_key.pem')); //私钥 可以自己生成,注意这里要使用 密钥对,请求百度下载,两对密钥对 let token = jwt.sign({ data, exp: created + 60 * 30, }, cert, { algorithm: 'RS256' }); return token; } // 校验token verifyToken() { let token = this.data; let cert = fs.readFileSync(path.join(__dirname, '../../pem/public_key.pem')); //公钥 可以自己生成 let res; try { let result = jwt.verify(token, cert, { algorithms: ['RS256'] }) || {}; let { exp = 0 } = result, current = Math.floor(Date.now() / 1000); if (current <= exp) { res = result.data || {}; } } catch (e) { res = 'err'; } return res; } } module.exports = Jwt; 
  • 次は、2つの特定のトークン検証関数モジュールです。
    ミドルウェアフォルダー
    loginGuard.js && loginPash.jsに配置します
const JwtUtil = require('../model/util/jwt')
const { User } = require('../model/create') const bcrypt = require('bcrypt') const guard = async(req, res, next) => { //注意使用第三方模块处理post //进图具体的业务逻辑,解构出来我们需要的东西 const { email, password, _id } = req.body; //注意啊,由于我们的中间件处理的请求于是乎我们的req身上就有这个处理的所有数据了,这个之前有说过 console.log(req.body); if (email.trim().length == 0 || password.trim().length == 0) { res.status(400).send( JSON.stringify({ message: '邮箱或密码错误' }) ) //注意send自动把状态码设置成了200,所以你需要改一下 return } //如果用户存在就先找到这个用户额信息,注意这里的这个异步await let user = await User.findOne({ email }); //这里的user就是指向当前查询出来的数据文档对象 if (user) { //比对操作,第一个参数是一个明文密码,第二个参数我们查询出来的加密密码 ,方法返回一个Boolean值,对比成功就是true,异步api可以直接加await const isValid = await bcrypt.compare(password, user.password) if (isValid) { //用户校验成功,添加tooken // 登陆成功,添加token验证 let _id = user._id.toString(); // 将用户id传入并生成token let jwt = new JwtUtil(_id); let token = jwt.generateToken(); // 将 token 返回给客户端 res.send({ status: 200, msg: '登陆成功', token: token }); //校验成功就 next() } else { res.status(400).send( JSON.stringify({ message: '邮箱或密码错误' }) ) } } else { res.status(400).send( JSON.stringify({ message: '邮箱或密码错误' }) ) } } module.exports = guard 

loginPash.js


const JwtUtil = require('../model/util/jwt')





//验证token
const loginPash = function(req, res, next) { // 我这里知识把登陆和注册请求去掉了,其他的多有请求都需要进行token校验 if (req.url != '/login?') { let token = req.headers.token; let jwt = new JwtUtil(token); let result = jwt.verifyToken(); // 如果考验通过就next,否则就返回登陆信息不正确 if (result == 'err') { console.log(result); console.log(req.url); res.send({ status: 403, msg: '登录已过期,请重新登录' }); // res.render('login.html'); } else { next(); } } else { next(); } }; module.exports = loginPash; 

5.最後に、これらのモジュール間の関係を整理します

実際、このインターフェースのセットはダウンしており、鶏肉を比較して、2日間の空き時間を費やしました。インターフェースのデザインにはあまり触れなかったため、バックグラウンドのデザインパターンやコンセプトについてはあまり知りませんでした。私が書いたのは、2,000行を超える3つのメモを書き、形が整う前に変更を繰り返したということです。上司が指を上げて迷路を指摘してくれることを願っています。また、この紹介文書があなたに利益をもたらすことを願っています。ここのモデルを使用して、より多くのインターフェースを開発します。しばらくお待ちください。

  • 各モジュールの参照関係、ユースケース図

おすすめ

転載: www.cnblogs.com/guoguo251/p/12709970.html