最近在看 koa,用 koa+mysql 搭了个简单 demo 环境后准备试一下,然后就一直返回 Not Found,把数据库相关操作注释掉之后又好了,最后发现原因是 logger 中间件里的next()
前没加return
。[喷水]
Code 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 const Koa = require ('koa' );const route = require ('koa-route' );const cors = require ('koa2-cors' );const knex = require ('knex' );const app = new Koa ();const mysql = knex ({ client : 'mysql' , connection : { host : 'localhost' , user : 'root' , password : '***' , database : 'test' }, debug : true , pool : { min : 0 , max : 7 }, acquireConnectionTimeout : 10000 , migrations : { tableName : 'migrations' } });const getCodeById = id => mysql.select ().table ('test' ).where ('a_tid' , id);const logger = (ctx, next ) => { console .log (`${new Date ().toLocaleString()} ${ctx.request.method} ${ctx.request.url} ` ); return next (); }const test = async ctx => { let res = {}; try { res.data = await getCodeById (1 ); res.status = 1 ; res.msg = 'SUCCESS' ; } catch (error) { console .log ('error: ' , error); res.data = []; res.status = 0 ; res.msg = 'FAIL' ; } ctx.response .body = res; }; app.use (cors ()); app.use (logger); app.use (route.get ('/test' , test)); app.listen (3000 );
后来发现已经有现成的 koa-logger 了 [#允悲]wwww
Answers from stackoverflow
It seems that if you want to use a common function as middleware, you have to return the next function .
Why common function as middlerware have to return the next function
I think it’s because you have to return a promise from your middleware to work with other middlewares. The next return a promise, as you return it, you return a promise. See this issue for more discussions github.com/koajs/koa/issues/997.
See more: nodejs(koa):Can’t set headers after they are sent
koa2+koa-router+mysql keep returning ‘Not Found’