欧美free性护士vide0shd,老熟女,一区二区三区,久久久久夜夜夜精品国产,久久久久久综合网天天,欧美成人护士h版

目錄

柚子快報(bào)激活碼778899分享:【Node.JS】koa

柚子快報(bào)激活碼778899分享:【Node.JS】koa

http://yzkb.51969.com/

文章目錄

概述koa和express對(duì)比koa下載安裝使用1.創(chuàng)建koa項(xiàng)目文件目錄2. 創(chuàng)建koa服務(wù)3. 添加路由 koa-router4. 數(shù)據(jù)庫(kù)服務(wù) mongodb5. 添加請(qǐng)求參數(shù)json處理 koa-bodyparser6. 用戶(hù)接口舉例7.引入koa一些常用插件8.用戶(hù)登錄驗(yàn)證 koa-jwt9.webpack生產(chǎn)打包

來(lái)源

概述

Koa 是一個(gè)新的 web 框架,由 Express 幕后的原班人馬打造, 致力于成為 web 應(yīng)用和 API 開(kāi)發(fā)領(lǐng)域中的一個(gè)更小、更富有表現(xiàn)力、更健壯的基石。 通過(guò)利用 async 函數(shù),Koa 幫你丟棄回調(diào)函數(shù),并有力地增強(qiáng)錯(cuò)誤處理。 Koa 并沒(méi)有捆綁任何中間件, 而是提供了一套優(yōu)雅的方法,幫助您快速而愉快地編寫(xiě)服務(wù)端應(yīng)用程序。

koa和express對(duì)比

Koa采用洋蔥模型

通常都會(huì)說(shuō)Koa是洋蔥模型,這重點(diǎn)在于中間件的設(shè)計(jì)。但是按照上面的分析,會(huì)發(fā)現(xiàn)Express也是類(lèi)似的,不同的是Express中間件機(jī)制使用了Callback 實(shí)現(xiàn),這樣如果出現(xiàn)異步則可能會(huì)使你在執(zhí)行順序上感到困惑,因此如果我們想做接口耗時(shí)統(tǒng)計(jì)、錯(cuò)誤處理Koa的這種中間件模式處理起來(lái)更方便些。最后一點(diǎn)響應(yīng)機(jī)制也很重要, Koa不是立即響應(yīng),是整個(gè)中間件處理完成在最外層進(jìn)行了響應(yīng),而Express則是立即響應(yīng)。

Koa更輕量

koa不提供內(nèi)置的中間件; koa不提供路由,而是把路由這個(gè)庫(kù)分離出來(lái)了(koa/router)

Context對(duì)象

koa增加了一個(gè)Context的對(duì)象,作為這次請(qǐng)求的上下文對(duì)象(在koa2中作為中間件的第一個(gè)參數(shù)傳入)。同時(shí)Context上也掛載了Request和Response兩個(gè)對(duì)象。Express類(lèi)似, 這兩個(gè)對(duì)象都提供了大量的便捷方法輔助開(kāi)發(fā)這樣的話(huà)對(duì)于在保存一些公有的參 數(shù)的話(huà)變得更加合情合理。

異步流程控制

express采用callback來(lái)處理異步,koa采用async/await。 async/await使用同步的寫(xiě)法來(lái)處理異步,明顯好于callback和promise,

中間件模型

express基于connect中間件,線(xiàn)性模型; koa中間件采用洋蔥模型(對(duì)于每個(gè)中間件,在完成了-些事情后,可以非常優(yōu)雅的將控制權(quán)傳遞給下一個(gè)中間件,并能夠等待它完成,當(dāng)后續(xù)的中間件完成處理后,控制權(quán)又回到了自己) 同步代碼 同步方法沒(méi)有什么區(qū)別:

01-express-同步.js

const express = require("express")

const app = express()

app.use((req, res, next) => {

console.log("111111")

next()

console.log("333333")

res.send("hello world")

})

app.use((req, res, next) => {

// 同步操作

console.log("22222")

})

app.listen(3000)

運(yùn)行輸出

111111

22222

333333

01-koa-同步 .js

const Koa = require("koa")

const app = new Koa()

app.use((ctx, next) => {

console.log("111111")

next()

console.log("333333")

ctx.body("hello world")

})

app.use((ctx, next) => {

// 同步操作

console.log("22222")

})

app.listen(3000)

運(yùn)行輸出:

111111

22222

333333

異步代碼 next()表示可以執(zhí)行下一個(gè)中間件,當(dāng)下一個(gè)中間件執(zhí)行完成之后,如果上一個(gè)中間件沒(méi)有執(zhí)行完,再返回上一個(gè)中間件繼續(xù)執(zhí)行。

01-express-異步.js

const express = require("express")

const app = express()

app.use(async (req, res, next) => {

console.log("111111")

await next()

console.log("444444")

res.send("hello world")

})

app.use(async (req, res, next) => {

console.log("22222")

// 異步操作

await delay(1000)

console.log("33333")

})

function delay(time) {

return new Promise((resolve, reject) => {

setTimeout(resolve,time)

})

}

app.listen(3000)

運(yùn)行輸出:

111111

22222

444444

33333

由于next()返回的不是promise對(duì)象因此await不起作用,所以輸出不會(huì)像我們所想輸出

01-koa-異步.js

const Koa = require("koa")

const app = new Koa()

app.use((ctx, next) => {

console.log("111111")

next()

console.log("444444")

})

app.use((ctx, next) => {

console.log("22222")

// 異步操作

delay(1000)

console.log("33333")

})

function delay(time) {

return new Promise((resolve, reject) => {

setTimeout(resolve,time)

})

}

app.listen(3000)

運(yùn)行輸出:

111111

22222

33333

444444

koa洋蔥模型,正常執(zhí)行。

koa下載安裝

npm init

npm i koa

Koa基本框架

const Koa = require("koa")

const app = new Koa()

// ctx=context 相當(dāng)于res和req的合并

app.use((ctx, next) => {

})

app.listen(3000)

使用

1.創(chuàng)建koa項(xiàng)目文件目錄

我們學(xué)習(xí)的第一步就是先搭好項(xiàng)目目錄,這里會(huì)有我們項(xiàng)目中使用到的任何東西。

// 創(chuàng)建項(xiàng)目文件夾 也可手動(dòng)創(chuàng)建

mkdir koa-app

// 進(jìn)入項(xiàng)目文件

cd koa-app

// 添加koa依賴(lài)

// 根據(jù)自己的包管理器執(zhí)行自己的命令 我這里以yarn舉例

yarn add koa -S

// 新建入口文件

echo >index.js

// 創(chuàng)建變量管理目錄 const

mkdir const

// 創(chuàng)建數(shù)據(jù)庫(kù)管理目錄 database

mkdir database

// 創(chuàng)建中間件管理目錄 middlewares

mkdir middlewares

// 創(chuàng)建路由管理目錄 router

mkdir router

// 創(chuàng)建靜態(tài)資源管理目錄 static

mkdir static

// 創(chuàng)建工具類(lèi)管理目錄 utils

mkdir utils

// 創(chuàng)建html文件管理目錄 view

// 主要用于測(cè)試自己接口

mkdir const

// 創(chuàng)建webpack打包文件

echo >webpack.config.js

這時(shí)候我們生成的目錄結(jié)構(gòu)大致如下

--koa-app

--const

--database

--middlewares

--router

--static

--utils

--view

-- index.js

-- packjson.js

-- webpack.config.js

2. 創(chuàng)建koa服務(wù)

這時(shí)候我們就可以創(chuàng)建koa服務(wù),啟動(dòng)后就可以訪(fǎng)問(wèn)服務(wù)器目錄了。

// index.js

const Koa = require("koa");

const app = new Koa();

app.use(async ctx => {

ctx.body = "hellO 歡迎使用koa"

})

app.listen(3000);

// 啟動(dòng)koa服務(wù)

node index.js

// 訪(fǎng)問(wèn)服務(wù)

在瀏覽器地址欄輸入 localhost:3000

啟動(dòng)服務(wù)后我們打開(kāi)瀏覽器就能看到"hellO 歡迎使用koa"說(shuō)明我們koa程序運(yùn)行成功。

3. 添加路由 koa-router

我們后臺(tái)服務(wù)已經(jīng)搭建好了,那下一步必不可少的就是路由管理了,這里我們使用koa-router插件

// /router/index.js

// 引入koa-router

const Router = require('koa-router');

// 引入user路由對(duì)象

const user = require('./user/index.js');

const view = require('./view/index.js')

const goods = require('./goods/index.js');

const category = require('./category/index.js');

const upload = require('./upload/index.js')

const rule = require('./rule/index.js')

const menu = require('./menu/index.js')

const role = require('./role/index.js')

const managerUser = require('./managerUser/index.js')

const attribute = require('./attribute/index.js')

// 生成新的router對(duì)象

let router = new Router();

// 添加路由管理

router.use('/api/user', user.routes())

router.use('/view', view.routes())

router.use('/api/goods', goods.routes())

router.use('/api/category', category.routes())

router.use('/api/upload', upload.routes())

router.use('/api/rule', rule.routes())

router.use('/api/menu', menu.routes())

router.use('/api/role', role.routes())

router.use('/api/managerUser', managerUser.routes())

router.use('/api/attribute', attribute.routes())

// 導(dǎo)出路由

module.exports = router

這里我是以自己寫(xiě)好的項(xiàng)目文件直接復(fù)制了,如果是測(cè)試的話(huà)不需要導(dǎo)入那么多路由對(duì)象,導(dǎo)入一個(gè)自己已經(jīng)寫(xiě)好的就行了。

接下來(lái)我們就需要修改index.js文件與編寫(xiě)user路由

// /router/user/index.js

router.get('/list', async (ctx) => {

ctx.body = {

code: 200,

message: '訪(fǎng)問(wèn)成功'

}

})

// index.js

const Koa = require("koa");

const router = require("./router/index.js"); // 路由

const app = new Koa();

// 添加路由中間件

app.use(router.routes()).use(router.allowedMethods());

app.use(async ctx => {

ctx.body = "hellO 歡迎使用koa"

})

app.listen(3000);

這時(shí)候我們重新啟動(dòng)koa服務(wù)后,訪(fǎng)問(wèn)localhost/3000/api/user/list 就能獲取ctx.body的內(nèi)容了。 做到這里我們已經(jīng)實(shí)現(xiàn)了自己的第一個(gè)接口了。剩下就是去數(shù)據(jù)庫(kù)里面獲取數(shù)據(jù)就形成了后臺(tái)數(shù)據(jù)服務(wù)了。 是不是很棒呢!

4. 數(shù)據(jù)庫(kù)服務(wù) mongodb

這里因?yàn)閷W(xué)習(xí)的是mongodb數(shù)據(jù)庫(kù),所以例子都會(huì)是以mongodb數(shù)據(jù)庫(kù)為例。其實(shí)用mysql的同學(xué)也可以自己去看一下mysql的引。

數(shù)據(jù)庫(kù)的引入主要是做了2個(gè)步驟, 第一連接數(shù)據(jù)庫(kù),第二創(chuàng)建數(shù)據(jù)model對(duì)象,并執(zhí)行數(shù)據(jù)庫(kù)操作。 mongodb使用的是mdb語(yǔ)句去做的查詢(xún),mysql則是使用的sql語(yǔ)句。

當(dāng)然每個(gè)數(shù)據(jù)庫(kù)特性都不一樣,在什么項(xiàng)目中使用什么數(shù)據(jù)庫(kù)都需要在搭建項(xiàng)目目錄的時(shí)候考慮到的,比如mysql, oracle 都是關(guān)系型的,在做一些數(shù)據(jù)關(guān)聯(lián)性強(qiáng)的一些網(wǎng)站上更加適用比如電商,金融,證券,醫(yī)療等。 而非關(guān)系型的mongodb數(shù)據(jù)因?yàn)閿?shù)據(jù)結(jié)構(gòu)更加多變,適用與一些日記管理,博客,官網(wǎng)等

話(huà)不多說(shuō),我們來(lái)創(chuàng)建我們的數(shù)據(jù)庫(kù)服務(wù)吧

添加依賴(lài)

// 添加依賴(lài)

yarn add glob mongoose -S

創(chuàng)建mongosse文件

// 添加mongoose文件 /database/index.js

// 添加mongosse

const mongoose = require('mongoose')

// 數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)地址

const db = "mongodb://127.0.0.1/waimai"

// glob :提供匹配文件路徑的方法,可以快速地找 到需要讀取的文件

const glob = require('glob');

const { resolve } = require('path')

// 初始化文檔模式

exports.initSchemas = async () => {

await glob.sync(resolve(__dirname, './schema', './*.js')).forEach((v) => {

require(v)

})

}

exports.connect = () => {

// 連接數(shù)據(jù)庫(kù)

mongoose.connect(db)

return new Promise((resolve, reject) => {

// 添加數(shù)據(jù)庫(kù)斷開(kāi)監(jiān)聽(tīng)事件

mongoose.connection.on('disconnected', () => {

console.log('數(shù)據(jù)庫(kù)斷開(kāi)---------------')

mongoose.connect(db)

})

// 添加數(shù)據(jù)庫(kù)啟動(dòng)監(jiān)聽(tīng)事件

mongoose.connection.on('open', () => {

console.log('數(shù)據(jù)庫(kù)連接---------------1')

mongoose.connect(db)

resolve();

})

})

}

// index.js 引入mongoose文件

// moogose初始化

const { connect, initSchemas } = require("./database/index");

(async () => {

await connect();

await initSchemas();

})();

我們重啟服務(wù)后就能連接到mongodb數(shù)據(jù)庫(kù)了, 在conosle里面我們能看到 數(shù)據(jù)庫(kù)連接字樣

5. 添加請(qǐng)求參數(shù)json處理 koa-bodyparser

添加新依賴(lài)

yarn add koa-bodyparser -D

更新index.js

const bodyParser = require("koa-bodyparser"); // requeast請(qǐng)求

app.use(bodyParser());

6. 用戶(hù)接口舉例

添加新依賴(lài)

yarn add bcrypt -D

創(chuàng)建mongoose.model模型

const mongoose = require('mongoose');

const Schema = mongoose.Schema;

let ObjectId = Schema.Types.ObjectId;

// const bcrypt = require('bcrypt');

const SALT_WORK_FACTOR = 10;

// 前臺(tái)用戶(hù)表接口

const userSchema = new Schema({

UserId: ObjectId,

userName: {

unique: true,

type: String

},

passWord: String,

avator: String,

hashPassword: String,

nikeName: String,

address: String,

isBlack: Boolean,

sex: String,

createAt: {

type: Date,

default: Date.now(),

},

lastLoginAt: {

type: Date,

default: Date.now(),

},

})

// 每次存儲(chǔ)時(shí)都要執(zhí)行,加鹽加密

userSchema.pre('save', function (next){

bcrypt.genSalt(SALT_WORK_FACTOR,(err,salt)=>{

if(err) return next(err)

bcrypt.hash(this.passWord,salt,(err,hash)=>{

if(err) return next(err)

this.hashPassword = hash

next()

})

})

})

// 添加自定義方法

userSchema.methods = {

// 對(duì)比密碼一致性

comparePassword: (_password, hashPassword) => {

return new Promise((resolve, reject) => {

// 對(duì)比密碼方法

bcrypt.compare(_password, hashPassword, (err, isMatch) => {

if(!err) resolve(isMatch);

reject(err)

})

})

}

}

// 發(fā)布模型

module.exports = mongoose.model('User', userSchema)

添加用戶(hù)接口

const Router = require('koa-router');

const mongoose = require('mongoose')

let router = new Router();

const User = require('../../database/schema/User')

// 用戶(hù)注冊(cè)

router.post('/register', async (ctx) => {

const userName = ctx.request.body.userName;

const passWord = ctx.request.body.passWord;

let newUser = new User({

userName,

passWord,

})

.save()

.then((res) => {

ctx.body = {

code: 200,

message: "添加用戶(hù)成功",

};

})

.catch((err) => {

ctx.body = {

code: 500,

message: "添加失敗" + err,

};

});;

})

router.get('/list', async (ctx) => {

// 引入user模型

// const User = mongoose.model('User');

const uid = ctx.request.query.uid || '';

// 分頁(yè) page

let page = ctx.request.body.page || 1;

// 分頁(yè)每頁(yè)數(shù)量

let limit = ctx.request.body.limit || 8;

// 上一次獲取位置

const start =(page - 1)*limit;

// console.log( userName, User, 'User')

const result = await User.find().exec()

console.log(result, 'result')

ctx.body = {

code: 200,

data: result.slice((page-1)*limit, page*limit),

page: {

page: page,

limit,

total: result.length ,

lastPage: parseInt(result.length / limit)

}

}

// ctx.body = ctx.request.body;

})

module.exports = router;

這時(shí)候我們就已經(jīng)寫(xiě)好了用戶(hù)添加接口與用戶(hù)列表接口。因?yàn)橛脩?hù)的密碼需要保密,我們?cè)谶@里用了bcrypt去做了加鹽加密,考慮到了bcrypt的加密是不可逆的所以我們這里用了passWord對(duì)原密碼做了保存。

這里我們使用了schema的自定義方法與 schema的鉤子函數(shù)

userSchema.methods

向由該 schema 編譯的 model 構(gòu)造的 document 添加一個(gè)實(shí)例方法.

userSchema.pre

給 schema 定義一個(gè)前置鉤子 (pre hook)

7.引入koa一些常用插件

處理跨域問(wèn)題 koa2-cors

yarn add koa2-cors -D

// index,js

const koa2cors = require("koa2-cors"); // 配置跨域

app.use(koa2cors({

origin: "*",

maxAge: 5,

allowMethods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'],

allowHeaders: ['Content-Type', 'Authorization', 'Accept'],

}));

添加靜態(tài)文件目錄 koa-static

yarn add koa-static -D

// index.js

const koaStatic = require("koa-static"); // 靜態(tài)目錄

app.use(koaStatic("./"));

添加websokit服務(wù) koa-websocket

yanr add koa-websocket -S

// index.js

const websocket = require("koa-websocket"); // socket

// 這時(shí)候app需用被websoket包裹

const app = websocket(new Koa());

// 建立socket連接

app.ws.use(async (ctx) => {

// the websocket is added to the context as `ctx.websocket`.

ctx.websocket.send("我是服務(wù)器");

ctx.websocket.on("message", function (message) {

// do something

const msg = message.toString("utf-8");

console.log("客戶(hù)端發(fā)來(lái)消息", msg);

});

});

添加xss防御

yarn add xss -S

// index.js

const xss = require('./middlewares/xss.js') // xss

app.use(xss())

// /middlewares/xss.js

const xss = require("xss"); // 需要 npm install xss -S

const xssHandler = () => {

return async (ctx, next) => {

try {

const body = ctx.request.body;

for (const key in body) {

if (typeof body[key] === "string") {

body[key] = xss(body[key]);

}

}

// 一定要添加await

await next();

} catch (error) {

// console.error(error)

throw error;

}

};

};

module.exports = xssHandler;

圖片文件處理 koa-multer

yarn add koa-multer -D

// /router/upload/index.js

const Router = require('koa-router');

let router = new Router();

const multer = require('koa-multer');

//配置

const storage = multer.diskStorage({

//配置圖片上傳的目錄

destination: function (req, file, cb) {

console.log('destination')

cb(null, 'static/images/'); //注意路徑必須存在

},

//圖片上傳完成重命名

filename: function (req, file, cb) {

console.log('filename')

// 獲取后綴名

var fileFormat = file.originalname.split('.');

cb(null, Date.now() + '.' + fileFormat[fileFormat.length - 1]);

},

});

const upload = multer({ storage: storage });

router.post('/img', upload.single('file'), async ctx => {

console.log(ctx.req.file, 'ctx.req.file')

ctx.body = {

code: 200,

data: {

filename: ctx.req.file.filename,//返回文件名

path: ctx.req.file.destination + ctx.req.file.filename

}

}

})

module.exports = router;

請(qǐng)求參數(shù)驗(yàn)證 Joi

訪(fǎng)問(wèn)接口時(shí)會(huì)先校驗(yàn)參數(shù)是否傳對(duì),如果對(duì)繼續(xù)后面的邏輯,如果參數(shù)校驗(yàn)不對(duì)則會(huì)直接返回錯(cuò)誤信息給前端。

yarn add Joi -D

// /router/user/index.js

const Joi = require("joi");

const validateSchemaJoi = require("../../middlewares/validateSchemaJoi");

const userSchema = Joi.object({

userName: Joi.string().min(1).required(),

});

// 用戶(hù)注冊(cè)

router.post('/register', validateSchemaJoi("post", userSchema), async (ctx) => {

// 注冊(cè)流程

})

// /middlewares/validateSchemaJoi

function validateSchemaJoi(method, schema) {

async function validateSchema (ctx, next) {

let data = undefined;

if (method === 'get') {

data = ctx.request.query;

} else {

data = ctx.request.body;

}

const { value, error } = schema.validate(data);

if (error) {

ctx.body = {

code: 400,

error

};

} else {

next();

}

}

return validateSchema;

}

module.exports = validateSchemaJoi;

8.用戶(hù)登錄驗(yàn)證 koa-jwt

用戶(hù)驗(yàn)證有3種方式

1。cookie 2. session 3. token

這里我們就以token來(lái)做用戶(hù)驗(yàn)證。

添加依賴(lài)

yarn add koa-jwt jsonwebtoken -S

用戶(hù)登錄添加token返回

// /router/user/index.js

var jwt = require('jsonwebtoken');

router.post('/login', async (ctx) => {

const userName = ctx.request.body.userName;

const passWord = ctx.request.body.passWord;

// 查詢(xún)用戶(hù)是否存在

await User.findOne({ userName: userName }).exec().then(async result => {

// 如果用戶(hù)名存在

if(result) {

let newUser = new User();

// 校驗(yàn)用戶(hù)密碼

await newUser.comparePassword(passWord, result.hashPassword).then(isMatch => {

// 如果用戶(hù)校驗(yàn)成功

if(isMatch) {

// 生成token

const token = jwt.sign({userName: result.userName}, 'secret', { expiresIn: '2h' });

// 返回給前端

ctx.body = {

code: 200,

message: isMatch,

data: {

token: token,

uid: result._id

}

}

}else {

ctx.body = {

code: 500,

message: isMatch

}

}

})

}else {

ctx.body = {

code: 500,

message: '用戶(hù)名不存在!'

}

}

}).catch(err => {

// console.log('result----err')

ctx.body = {

code: 500,

message: err,

}

})

})

添加token白名單 不攔截請(qǐng)求

const { jwtWhiteList } = require("./const/jwtWhiteList"); // token白名單

// /const/jwtWhiteList.js

const jwtWhiteList = [

/^\/api\/user\/login/,

/^\/view/,

/^\/static/,

"/api/managerUser/login",

"/api/goods/getGoodsDetailsInfo",

"/api/upload/img"

]

module.exports = {

jwtWhiteList

}

添加路由token驗(yàn)證攔截

token路由攔截主要做了以下這幾件事

1.koa-jwt對(duì)每個(gè)請(qǐng)求頭部信息進(jìn)行token校驗(yàn),如果用戶(hù)校驗(yàn)失敗就返回401,過(guò)濾掉白名單的請(qǐng)求。

2.在路由中間件上面添加中間件,當(dāng)用戶(hù)token失效后我們就會(huì)走401步驟 返回用戶(hù)token失效信息,讓前端去重定向到登錄頁(yè)

3.用戶(hù)token都是有時(shí)效性的,當(dāng)然時(shí)效性越短越好,因?yàn)闆](méi)用數(shù)據(jù)庫(kù)去存儲(chǔ)token所以在項(xiàng)目重啟后可能會(huì)有失效問(wèn)題,沒(méi)驗(yàn)證過(guò)。我這默認(rèn)是2小時(shí),當(dāng)小于一半的失效時(shí)間時(shí)我就會(huì)生成新的token交予前端重新生成。也就是所謂的token續(xù)存機(jī)制。

// index.js

const jwt = require("koa-jwt"); // token驗(yàn)證

const jwtToken = require('jsonwebtoken');

// 路由攔截器中間件

app.use(function (ctx, next) {

// console.log("ce0", ctx.header.authorization)

if (ctx.header && ctx.header.authorization) {

const parts = ctx.header.authorization.split(" ");

if (parts.length === 2) {

//取出token

const scheme = parts[0];

const token = parts[1];

if (/^Bearer$/i.test(scheme)) {

try {

const decoded = jwtToken.verify(token, 'secret',{ complete: true });

// iat: 簽發(fā)時(shí)間 exp: 過(guò)期時(shí)間

const { iat, exp, userName } = decoded.payload;

const nowTime = new Date().getTime()/1000;

const lastTime = (exp - nowTime)/60;

// 當(dāng)前事件離過(guò)期時(shí)間還剩一半的時(shí)候更新token 如果過(guò)期就走401

if(decoded && 0 < lastTime && lastTime< ((exp-iat)/60)/2) {

// console.log('更新token0')

const newToken = jwtToken.sign({userName: userName}, 'secret', { expiresIn: '2h' });

// console.log('更新token1', newToken)

ctx.res.setHeader('Authorization', newToken)

}

} catch (error) {

console.log("ce3")

//token過(guò)期

}

}

}

}

return next().catch((err) => {

if (401 == err.status || err.status === 301) {

ctx.status = 401;

ctx.body = {

code: err.status,

message: "token已經(jīng)失效?。。?!"

};

// ctx.body = {error: err.originalError ? err.originalError.message : err.message};

} else {

throw err;

}

});

});

// 添加token中間件

app.use(jwt({ secret: "secret" }).unless({ path: jwtWhiteList }));

9.webpack生產(chǎn)打包

這里就做了簡(jiǎn)單的js打包,打包后的文件體積會(huì)變小,因?yàn)閣ebpack設(shè)置mode為生產(chǎn)環(huán)境后默認(rèn)就做了許多處理。

// webpack.config.js

const webpack = require("webpack");

const path = require("path");

const { CleanWebpackPlugin } = require("clean-webpack-plugin");

const nodeExternals = require("webpack-node-externals");

// const MinifyPlugin = require('babel-minify-webpack-plugin');

const CopyWebpackPlugin = require('copy-webpack-plugin')

module.exports = {

entry: "./index.js",

mode: "production",

output: {

path: path.resolve(__dirname, "./dist"),

filename: "[name].js",

},

target: "node",

externals: [nodeExternals()], //node 打包可去除一些警告

module: {

rules: [

{

test: /\.js$/,

exclude: /node_modules/,

use: [

{

loader: "babel-loader",

options: {

presets: ["@babel/preset-env"], //兼容es6,并添加.babelrc

},

},

],

},

],

},

plugins: [

// 清楚dist

new CleanWebpackPlugin(),

// js壓縮

// split切片

// 復(fù)制靜態(tài)目錄

new CopyWebpackPlugin({

patterns: [

{

from: path.resolve(__dirname, './static'),

to: path.resolve(__dirname, './dist/static')

}

]

})

// new MinifyPlugin() //壓縮js

],

};

// packjson.js 添加啟動(dòng)指令

"build": "webpack --progress --config webpack.config.js",

"prd_server": "node ./dist/main.js"

來(lái)源

你需要的koa入門(mén)教學(xué) koa框架

柚子快報(bào)激活碼778899分享:【Node.JS】koa

http://yzkb.51969.com/

參考鏈接

評(píng)論可見(jiàn),查看隱藏內(nèi)容

本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀(guān)點(diǎn)和立場(chǎng)。

轉(zhuǎn)載請(qǐng)注明,如有侵權(quán),聯(lián)系刪除。

本文鏈接:http://gantiao.com.cn/post/18868802.html

發(fā)布評(píng)論

您暫未設(shè)置收款碼

請(qǐng)?jiān)谥黝}配置——文章設(shè)置里上傳

掃描二維碼手機(jī)訪(fǎng)問(wèn)

文章目錄