在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/HTML/ express 和 koa 的中間件執(zhí)行機(jī)制

express 和 koa 的中間件執(zhí)行機(jī)制

const Koa = require('koa')
const route = require('koa-route')
const app = new Koa()

app.use(async function middleware1(ctx, next) {
  console.log('middleware1 開始')
  await next()
  console.log('middleware1 結(jié)束')
})

app.use(async function middleware2(ctx, next) {
  console.log('middleware2 開始')
  await next()
  console.log('middleware2 結(jié)束')
})

app.use(async function middleware3(ctx, next) {
  console.log('middleware3 開始')
  await next()
  console.log('middleware3 結(jié)束')
})

app.use(route.get('/', (ctx, next) => {
  ctx.body = 'hello koa'
}))

app.listen(3001, function () {
  console.log('server is listening on port 3001')
})

middleware1 開始
middleware2 開始
middleware3 開始
middleware3 結(jié)束
middleware2 結(jié)束
middleware1 結(jié)束

這段代碼使用 Koa,按照 Koa 的“洋蔥圈”中間件模型,中間件里的代碼會像“回形針”一樣執(zhí)行,執(zhí)行結(jié)果如上。

const express = require('express')
const app = express()

app.use(function middleware1(req, res, next) {
  console.log('middleware1 開始')
  next()
  console.log('middleware1 結(jié)束')
})

app.use(function middleware2(req, res, next) {
  console.log('middleware2 開始')
  next()
  console.log('middleware2 結(jié)束')
})

app.use(function middleware3(req, res, next) {
  console.log('middleware3 開始')
  next()
  console.log('middleware3 結(jié)束')
})

app.get('/', function (req, res, next) {
  res.end('hello express')
})

app.listen(3000, function () {
  console.log('server listening on port 3000!')
})

middleware1 開始
middleware2 開始
middleware3 開始
middleware3 結(jié)束
middleware2 結(jié)束
middleware1 結(jié)束

Express 的中間件模型是線性的,next() 之后的代碼應(yīng)該不會執(zhí)行,但是上面代碼的執(zhí)行結(jié)果卻和使用 Koa 一樣。
想請教大佬們解釋一下執(zhí)行結(jié)果為什么是這樣的。

回答
編輯回答
還吻
const Koa = require('koa')
const route = require('koa-route')
const app = new Koa()

app.use(async function middleware1(ctx, next) {
  console.log('middleware1 開始')
  await next()
  console.log('middleware1 結(jié)束')
})

app.use(async function middleware2(ctx, next) {
  const p = new Promise((resolve, reject) => {
    resolve('middleware2 開始')
  })
  p.then(res => {
    console.log(res)
  })
  await next()
  console.log('middleware2 結(jié)束')
})

app.use(async function middleware3(ctx, next) {
  console.log('middleware3 開始')
  await next()
  console.log('middleware3 結(jié)束')
})

app.use(route.get('/', (ctx, next) => {
  ctx.body = 'hello koa'
}))

app.listen(3001, function () {
  console.log('server is listening on port 3001')
})

// middleware1 開始
// middleware3 開始
// middleware2 開始
// middleware3 結(jié)束
// middleware2 結(jié)束
// middleware1 結(jié)束
const express = require('express')
const app = express()

app.use(function middleware1(req, res, next) {
  console.log('middleware1 開始')
  next()
  console.log('middleware1 結(jié)束')
})

app.use(function middleware2(req, res, next) {
  const p = new Promise((resolve, reject) => {
    resolve('middleware2 開始')
  })
  p.then(res => {
    console.log(res)
  })
  next()
  console.log('middleware2 結(jié)束')
})

app.use(function middleware3(req, res, next) {
  console.log('middleware3 開始')
  next()
  console.log('middleware3 結(jié)束')
})

app.get('/', function (req, res, next) {
  res.end('hello express')
})

app.listen(3000, function () {
  console.log('server listening on port 3000!')
})

// middleware1 開始
// middleware3 開始
// middleware3 結(jié)束
// middleware2 結(jié)束
// middleware1 結(jié)束
// middleware2 開始
2018年7月31日 06:36