{"id":5633,"date":"2017-01-08T18:32:38","date_gmt":"2017-01-08T10:32:38","guid":{"rendered":"https:\/\/sdeno.com\/?p=5633"},"modified":"2024-04-02T17:39:32","modified_gmt":"2024-04-02T09:39:32","slug":"koa2%e7%ac%94%e8%ae%b0","status":"publish","type":"post","link":"https:\/\/sdeno.com\/?p=5633","title":{"rendered":"koa2\u7b14\u8bb0 koa-generator\u811a\u624b\u67b6"},"content":{"rendered":"<p>koa\u7b14\u8bb0 koa2 \u7b14\u8bb0<\/p>\n<p>\u4e4b\u524d\u4e00\u76f4\u4f7f\u7528express\u89c9\u5f97\u8fd8\u53ef\u4ee5\uff0c\u4e0d\u4e45express\u56e2\u961f\u53c8\u51fa\u4e86\u4e00\u4e2akoa,\u4e5f\u51fa\u73b0\u4e861\uff0c2\u7248\u672c\uff0c\u76ee\u524d\u5b66\u4e60\u6700\u597d\u4f7f\u7528koa2\uff0c\u4f7f\u7528\u4e86es6\u8bed\u6cd5\u3002\u76f4\u63a5\u4e0a\u5e72\u8d27\uff0c\u4f7f\u7528\u8fc7express\u4e0a\u624b\u642d\u5efa\u4e00\u4e2a\u9879\u76ee\u5176\u5b9e\u5f88\u7b80\u5355\u3002<\/p>\n<p>\u9996\u5148\uff1a<\/p>\n<pre>npm install koa-generator -g  \/\/\u5168\u5c40\u5b89\u88c5\u8fd9\u4e2a\u5c31\u53ef\u4ee5\u4f7f\u7528koa\u547d\u4ee4\u4e86<\/pre>\n<p>\u5728\u4f60\u9700\u8981\u521b\u5efakoa\u9879\u76ee\u7684\u76ee\u5f55\u4e0b\u8f93\u5165\u4ee5\u4e0b\u547d\u4ee4<\/p>\n<pre>koa2 -e koa2   \/\/\u6b64\u65f6\u5c31\u4f1a\u51fa\u73b0\u4e00\u4e2akoa2\u7684\u76ee\u5f55\uff0c\u5e76\u4e14\u91cc\u9762\u4f1a\u6709\u4e00\u4e9b\u521d\u59cb\u5316\u7684\u6587\u4ef6\r\n\u5982\u679c\u60f3\u4f7f\u7528koa1\u7684\u8bdd\u5c31\r\nkoa -e \u76ee\u5f55\u540d\u79f0 \/\/\u751f\u6210\u7684\u662fkoa1\u7684\u7248\u672c\r\nkoa2 -e \u76ee\u5f55\u540d\u79f0 \/\/\u751f\u6210\u7684\u65f6koa2\u7684\u7248\u672c<\/pre>\n<p>\u8fdb\u5165\u5230koa2\u76ee\u5f55\u4e0b\uff0c\u63a5\u7740\u5b89\u88c5\u9700\u8981\u7684\u4f9d\u8d56\u6a21\u5757<\/p>\n<pre>npm install<\/pre>\n<p>\u542f\u52a8koa<\/p>\n<pre>node .\/bin\/www<\/pre>\n<p>\u6700\u540e\u6253\u5f00\u6d4f\u89c8\u5668\u8f93\u5165\uff1ahttp:\/\/localhost:3000\/ \uff0c\u5c31\u53ef\u4ee5\u770b\u5230\u6211\u4eec\u7f51\u7ad9\u5efa\u7acb\u4e86\u3002<\/p>\n<p>\u63d0\u793a\uff1a\u5982\u679c\u7b80\u5355\u4f7f\u7528node\u547d\u4ee4\u542f\u52a8koa 2\u62a5\u9519\u53ef\u4ee5\u5c1d\u8bd5\u4f7f\u7528<\/p>\n<pre>node --harmony xx.js<\/pre>\n<p>\u6765\u542f\u52a8\u6211\u4eec\u7684koa\u9879\u76ee\uff0c\u56e0\u4e3akoa\u6709\u65f6\u5019\u4f1a\u9700\u8981es5\u7684\u4e00\u4e9b\u5c5e\u6027\uff0c\u5e26\u6709&#8211;harmony\u53c2\u6570\u624d\u80fd\u591f\u542f\u7528\u90e8\u5206es5\u7684\u529f\u80fd\u3002<\/p>\n<p>\u8981\u4e48\u5347\u7ea7node.js\u73af\u5883\u5230<span style=\"color: #ff0000;\">7.6<\/span>\u4ee5\u4e0a<\/p>\n<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<\/p>\n<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<\/p>\n<p><span style=\"color: #ff0000;\">\u7b80\u5355\u7684\u542f\u52a8web\u670d\u52a1<\/span>,\u8bbf\u95eehttp:\/\/localhost:3000\/<\/p>\n<pre>var Koa =require('koa');\r\nvar app=new Koa();\r\n\r\napp.use(async function (ctx,next) {\r\n  await next();\r\n  ctx.response.type='text\/html';\r\n  ctx.response.body='&lt;div style=\"background: red\"&gt;\u4f60\u597d&lt;\/div&gt;';\r\n});\r\n\r\napp.listen(3000);<\/pre>\n<p>\/\/<span style=\"color: #ff0000;\"> koa2\u4e2d\u95f4\u4ef6\u6267\u884c\u987a\u5e8f<\/span> (\u6d0b\u8471\u6a21\u5f0f)<br \/>\n\/\/\u6700\u5148\u7684\u4e2d\u95f4\u4ef6\u4f1a\u88ab\u6267\u884c\uff0c\u76f4\u5230\u6267\u884c\u5230\u6700\u540e\u4e00\u4e2a\u4e2d\u95f4\u4ef6\u540e\u53c8\u4f1a\u518d\u6b21\u8fd4\u56de\u6765\uff0c<br \/>\n\/\/\u4e2d\u95f4\u4ef6\u5fc5\u987bawait next();\u4e0d\u7136\u5c31\u4e0d\u4f1a\u6267\u884c\u5230\u4e0b\u4e00\u4e2a\u4e2d\u95f4\u4ef6\u4e86\u3002<br \/>\n\/\/koa2\u542f\u52a8\u8fd0\u884c\u5176\u5b9e\u5c31\u662f\u5728\u6309\u7740\u6d0b\u8471\u6a21\u5f0f\u6267\u884c\u7740\u4e00\u4e2a\u4e2a\u4e2d\u95f4\u4ef6<br \/>\n\/\/\u5982\u679c\u8bf7\u6c42\u4e00\u4e2acss\u6587\u4ef6\u548c\u4e00\u4e2ajs\u6587\u4ef6\uff0c\u76f8\u5f53\u4e8e\u6267\u884c\u4e86\u67d0\u4e2a\u4e2d\u95f4\u4ef6\u4e24\u6b21<\/p>\n<pre>var Koa =require('koa');\r\nvar app=new Koa();\r\n\r\n\r\napp.use(async function (ctx,next) {\r\n  console.log(1); \/\/&lt;--\u6700\u5148\u88ab\u6267\u884c\r\n  await next();\r\n  console.log(2); \/\/&lt;--\u6700\u540e\u88ab\u6267\u884c\r\n});\r\n\r\n\r\napp.use(async function (ctx,next) {\r\n  console.log(3);\r\n  console.log(4);\r\n  await next();\r\n});\r\n\r\n\r\napp.use(async function (ctx,next) {\r\n  await next();\r\n  console.log(5);\r\n  console.log(6);\r\n});\r\n\r\n\r\napp.use(async function (ctx,next) {\r\n  console.log(7);\r\n  await next();\r\n  console.log(8);\r\n});\r\n\r\n\r\napp.listen(3000);\r\n\r\n\/\/ \u7ed3\u679c\r\n\/\/ 1\r\n\/\/ 3\r\n\/\/ 4\r\n\/\/ 7\r\n\/\/ 8\r\n\/\/ 5\r\n\/\/ 6\r\n\/\/ 2<\/pre>\n<p>\/\/<span style=\"color: #ff0000;\">\u5c01\u88c5\u4e00\u4e2a\u4e2d\u95f4\u4ef6<\/span><\/p>\n<p>\/\/test.js\u4e2d\u95f4\u4ef6<\/p>\n<pre>function log( ctx ) {\r\n  console.log( '\u6267\u884c\u81ea\u5b9a\u4e49\u4e2d\u95f4\u4ef6' )\r\n}\r\n\r\nmodule.exports = function () {\r\n  return async function ( ctx, next ) {\r\n    log(ctx);\r\n   await next()\r\n  }\r\n}<\/pre>\n<p>\/\/\u52a0\u8f7d\uff0c\u5e76\u8c03\u7528<\/p>\n<pre>var test=require('.\/test');\r\n\r\napp.use(test());<\/pre>\n<p>*koa@2\u4e2d\u95f4\u4ef6\u53ea\u652f\u6301 async\/await \u5c01\u88c5\u7684\uff0c\u5982\u679c\u8981\u4f7f\u7528koa@1\u57fa\u4e8egenerator\u4e2d\u95f4\u4ef6\uff0c\u9700\u8981\u901a\u8fc7\u4e2d\u95f4\u4ef6koa-convert\u5c01\u88c5\u4e00\u4e0b\u624d\u80fd\u4f7f\u7528<\/p>\n<p><span style=\"color: #ff0000;\">\u4e2d\u95f4\u4ef6\u4e4b\u95f4\u4f20\u9012\u6570\u636e<\/span><\/p>\n<pre>app.use(async function (ctx,next) {\r\n  ctx.haha='haha';\r\n  await next();\r\n});\r\n\r\n\r\napp.use(async function (ctx,next) {\r\n  await next();\r\n  console.log(ctx.haha); \/\/\u6211\u80fd\u83b7\u53d6\u5230\u4e0a\u4e00\u4e2a\u4e2d\u95f4\u4ef6\u8d4b\u503c\u7684\u53d8\u91cf\r\n});<\/pre>\n<p><span style=\"color: #ff0000;\">ctx\u4e0a\u4e0b\u6587<\/span><br \/>\nctx.response.type \u53ef\u4ee5\u7f29\u5199\u4e3a ctx.type\uff0c\u8fd4\u56de\u7ed9\u6d4f\u89c8\u5668\u7684\u53c2\u6570<br \/>\n\u6709\u7b49\u53f7\uff0c\u8868\u793a\u8fd8\u53ef\u4ee5\u4fee\u6539<br \/>\nctx.body<br \/>\nctx.body=<br \/>\nctx.status<br \/>\nctx.status=<br \/>\nctx.length=<br \/>\nctx.type<br \/>\nctx.type= \/\/ ctx.type = &#8216;text\/plain; charset=utf-8&#8217;;<br \/>\nctx.headerSent<br \/>\nctx.redirect()<br \/>\nctx.attachment()<br \/>\nctx.set() \/\/ ctx.set(&#8216;Content-Type&#8217;, &#8216;text\/html&#8217;)<br \/>\nctx.remove()<br \/>\nctx.lastModified=<br \/>\nctx.etag=<br \/>\n&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br \/>\nctx.request \/\/\u53d1\u9001\u7ed9\u670d\u52a1\u5668\u7aef<br \/>\nctx.header \/\/ctx.request.header = {&#8216;authorization&#8217;: &#8220;Bearer &#8221; + ctx.cookies.get(&#8216;state&#8217;)}<br \/>\nctx.method<br \/>\nctx.method=<br \/>\nctx.url<br \/>\nctx.url=<br \/>\nctx.path<br \/>\nctx.path=<br \/>\nctx.query<br \/>\nctx.query=<br \/>\nctx.querystring<br \/>\nctx.querystring=<br \/>\nctx.length<br \/>\nctx.host<br \/>\nctx.fresh<br \/>\nctx.stale<br \/>\nctx.socket<br \/>\nctx.protocol<br \/>\nctx.secure<br \/>\nctx.ip<br \/>\nctx.ips<br \/>\nctx.subdomains<br \/>\nctx.is()<br \/>\nctx.accepts()<br \/>\nctx.acceptsEncodings()<br \/>\nctx.acceptsCharsets()<br \/>\nctx.acceptsLanguages()<br \/>\nctx.get()<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #ff0000;\">\u652f\u6301Es6\u7684import\u5bfc\u5165<\/span><\/p>\n<p>package.json \u7684\u6839\u8282\u70b9\u65b0\u589e &#8220;type&#8221;: &#8220;module&#8221;\u00a0 \/\/\u6ce8\u610f\u8981\u00a0v14.15.1\u4ee5\u4e0a\uff0c \u4e0d\u63a8\u8350\u8fd9\u79cd\u5199\u6cd5\uff0c\u8fd9\u6837\u5c31\u4e0d\u652f\u6301commonjs\u8bed\u6cd5\u4e86<\/p>\n<p>\u6216\u8005\u628a\u8981\u5bfc\u5165\u7684\u6a21\u5757\u6539\u6210\u540e\u7f00\u4e3amjs ,\u00a0 import a from &#8216;.\/a.mjs&#8217;;<\/p>\n<p>\u4ece Node.js v13.2 \u7248\u672c\u5f00\u59cb<\/p>\n<div>\n<div>Node.js \u8981\u6c42 ES6 \u6a21\u5757\u91c7\u7528.mjs\u540e\u7f00\u6587\u4ef6\u540d\u3002\u4e5f\u5c31\u662f\u8bf4\uff0c\u53ea\u8981\u811a\u672c\u6587\u4ef6\u91cc\u9762\u4f7f\u7528import\u6216\u8005export\u547d\u4ee4\uff0c\u90a3\u4e48\u5c31\u5fc5\u987b\u91c7\u7528.mjs\u540e\u7f00\u540d\u3002Node.js \u9047\u5230.mjs\u6587\u4ef6\uff0c\u5c31\u8ba4\u4e3a\u5b83\u662f ES6 \u6a21\u5757\uff0c\u9ed8\u8ba4\u542f\u7528\u4e25\u683c\u6a21\u5f0f\uff0c\u4e0d\u5fc5\u5728\u6bcf\u4e2a\u6a21\u5757\u6587\u4ef6\u9876\u90e8\u6307\u5b9a&#8221;use strict&#8221;\u3002<\/div>\n<\/div>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>\/\/<span style=\"color: #ff0000;\">\u533a\u5206\u6d4b\u8bd5\u73af\u5883\u3001\u751f\u4ea7\u73af\u5883<\/span><br \/>\n\u53ef\u80fd\u9700\u8981\u5728\u4e0d\u540c\u73af\u5883\u4e0b\u8dd1\u4e0d\u540c\u7684\u903b\u8f91\uff0c\u8fd9\u65f6\u5019\u5c31\u9700\u8981\u5230<br \/>\n\u5b89\u88c5\uff1anpm i cross-env -g \/\/\u4e3awin\u548clinux\u505a\u597d\u4e86\u517c\u5bb9<br \/>\n\u542f\u52a8\u6267\u884c\uff1across-env NODE_ENV=production pm2 start .\/1.js \/\/\u4ee5\u751f\u4ea7\u65b9\u5f0f\u542f\u52a8<br \/>\n\u83b7\u53d6\u5224\u65ad\u65b9\u6cd5\uff1aprocess.env.NODE_ENV \/\/\u8f93\u51fa production<\/p>\n<p>cross-env NODE_ENV=production PORT=3001 node .\/1.js<br \/>\n\u83b7\u53d6\u7aef\u53e3process.env.PORT<\/p>\n<p>&nbsp;<\/p>\n<p>\u53e6\u4e00\u79cd\u65b9\u6cd5\uff1a<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">\"dev\": \".\/node_modules\/.bin\/nodemon bin\/www token=true\",\r\n\r\n\r\n\/\/\u83b7\u53d6 bin\/www xxx1=xxx2  \u540e\u9762\u7684\u53c2\u6570 \u6253\u5370\u51fa { xxx1:xxx2 }\r\nfunction getOption() {\r\n    const arr = process.argv.slice(2); \/\/ \u83b7\u53d6\u547d\u4ee4\u884c\u53c2\u6570\u6570\u7ec4\r\n    const r = arr.reduce((pre, item) =&gt; { \/\/ \u4f7f\u7528reduce\u65b9\u6cd5\u5bf9\u53c2\u6570\u6570\u7ec4\u8fdb\u884c\u5904\u7406\r\n        if (item.indexOf(\"=\") !== -1) { \/\/ \u5224\u65ad\u53c2\u6570\u662f\u5426\u6709\u7b49\u53f7\r\n            return [...pre, item.split(\"=\")]; \/\/ \u5c06\u5e26\u6709\u7b49\u53f7\u7684\u53c2\u6570\u8fdb\u884c\u5206\u5272\u5e76\u6dfb\u52a0\u5230\u7ed3\u679c\u6570\u7ec4\u4e2d\r\n        }\r\n        return pre; \/\/ \u5426\u5219\u8fd4\u56de\u539f\u7ed3\u679c\u6570\u7ec4\r\n    }, []);\r\n    const params = Object.fromEntries(r); \/\/ \u5c06\u7ed3\u679c\u6570\u7ec4\u8f6c\u5316\u4e3a\u53c2\u6570\u5bf9\u8c61\r\n    return params; \/\/ \u8fd4\u56de\u53c2\u6570\u5bf9\u8c61\r\n}\r\n\r\n\u8c03\u7528\uff1agetOption().token  \/\/\u83b7\u53d6\u90fdtoken\u7684\u5b57\u6bb5\u503c\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>\/\/<span style=\"color: #ff0000;\"> \u6570\u636e\u8ddf\u8e2a\u76d1\u542c<\/span><\/p>\n<pre>var Koa =require('koa');\r\nvar app=new Koa();\r\n\r\nconst logger = require('koa-logger');\r\n\r\napp.use(logger());\r\n\r\napp.use(async function (ctx,next) {\r\n await next();\r\n ctx.response.type='text\/html';\r\n ctx.response.body='&lt;div style=\"background: red\"&gt;\u4f60\u597d&lt;\/div&gt;';\r\n});\r\n\r\napp.listen(3000);<\/pre>\n<figure class=\"mdx-lazyload-container\" style=\"max-width:563px\"><div style=\"padding-top:26.998223801066%\"><\/div><div class=\"mdx-img-loading-sp mdui-valign\"><div><div class=\"mdui-spinner\"><\/div><\/div><\/div><img width=\"563\" height=\"152\" class=\"alignnone size-full wp-image-7575 lazyload\" title=\"koa2\u7b14\u8bb0 koa-generator\u811a\u624b\u67b6\" src=\"data:image\/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\" data-src=\"https:\/\/sdeno.com\/wp-content\/uploads\/2017\/01\/jianting1.png\" alt=\"https:\/\/sdeno.com\/wp-content\/uploads\/2017\/01\/jianting1.png\" data-srcset=\"https:\/\/sdeno.com\/wp-content\/uploads\/2017\/01\/jianting1.png 563w, https:\/\/sdeno.com\/wp-content\/uploads\/2017\/01\/jianting1-300x81.png 300w\" sizes=\"auto, (max-width: 563px) 100vw, 563px\"><\/figure>\n<p><span style=\"color: #ff0000;\">\u521b\u5efa\u4e00\u4e2a\u9875\u9762<\/span><\/p>\n<pre>\u521b\u5efa\u9996\u9875http:\/\/127.0.0.1\/\r\n router.get('\/', function (ctx, next) { \/\/\u9996\u9875\r\n     ctx.body = 'Hello World!';\r\n })<\/pre>\n<p>\u63a8\u8350\u6b64\u65b9\u6cd5\u521b\u5efa\u9875\u9762\uff1a<br \/>\n\u521b\u5efa\u5185\u9875\u5e76\u4e14\u5e262\u4e2a\u53c2\u6570 http:\/\/127.0.0.1\/www\/27\/28<\/p>\n<pre> router.get('www\/:id\/:age', async function (ctx, next) {\r\n   ctx.state = {\r\n      title:'ffff'+ctx.params.id\r\n   };\r\n   await ctx.render('index', {\r\n   });\r\n })<\/pre>\n<p><span style=\"color: #ff0000;\">\u00a0get\u4f20\u53c2<\/span><\/p>\n<pre>\/\/page1\u9875\u9762\u4f20\u53c2\r\nrouter.get('page1\/:id\/:age', async function (ctx, next) {\r\n   ctx.state = {\r\n      title:'ffff'+ctx.params.id\r\n   };\r\n   await ctx.render('index', {\r\n   });\r\n})\r\n\r\n\u5730\u5740\uff1ahttp:\/\/xxxx.com\/page1\/\u53c2\u65701\/\u53c2\u65702<\/pre>\n<pre>\/\/\u9996\u9875\u4f20\u53c2\r\nrouter.get(':id\/:age', async function (ctx, next) {\r\n   ctx.state = {\r\n      title:'ffff'+ctx.params.id\r\n   };\r\n   await ctx.render('index', {\r\n   });\r\n})\r\n\r\n\u5730\u5740\uff1ahttp:\/\/xxxx.com\/\u53c2\u65701\/\u53c2\u65702<\/pre>\n<p><span style=\"color: #ff0000;\">\u8fde\u7f00<\/span><\/p>\n<pre> router \/\/\u8fd9\u91cc\u662f4\u4e2a\u8def\u7531\r\n .get('\/', function (ctx, next) {\r\n    ctx.body = 'Hello World!';\r\n })\r\n .post('\/users', function (ctx, next) {\r\n    \/\/ ...\r\n })\r\n .put('\/users\/:id', function (ctx, next) {\r\n    \/\/ ...\r\n })\r\n .del('\/users\/:id', function (ctx, next) {\r\n    \/\/ ...\r\n });<\/pre>\n<p><span style=\"color: #ff0000;\">\u8def\u7531\u56de\u8c03<\/span><\/p>\n<p>\u4e3a\u67d0\u4e2a\u8def\u7531\u8bbf\u95ee\u6210\u529f\u6dfb\u52a0\u56de\u8c03<\/p>\n<pre>router.get('\/',async (ctx, next) =&gt; {\r\n  console.log('1');\r\n  await next(); \/\/\u8981\u52a0\u8fd9\u4e2a\u624d\u80fd\u6267\u884c\u5230all\u56de\u8c03\r\n  console.log('2');\r\n}).all('\/',async function (ctx, next) {\r\n  console.log('3');\r\n});\r\n\r\n\u7ed3\u679c\uff1a\r\n1\r\n3\r\n2\r\n\u8ddf\u4e2d\u95f4\u4ef6\u7684\u6d0b\u8471\u6a21\u5f0f\u4e00\u6837<\/pre>\n<p><span style=\"color: #ff0000;\">\u8def\u7531\u5168\u5c40\u00a0 \u00a0\uff08\u5f88\u6709\u7528\uff09 \u62e6\u622a\u5668<\/span><\/p>\n<p>\u6548\u679c\u5c31\u662f\u8bbf\u95ee\u4efb\u610f\u4e00\u4e2aurl\u8def\u7531\u4e4b\u524d\u65f6\uff0c\u90fd\u8981\u6267\u884c\u67d0\u6bb5\u4e1a\u52a1\u903b\u8f91\u3002<\/p>\n<p>\u4e0d\u7ba1\u5148\u8bbf\u95ee\u9996\u9875\u8fd8\u662fhaha\uff0c\u90fd\u8981\u5148\u6267\u884call\u8def\u7531\u3002<\/p>\n<pre>router.all('*',async function (ctx, next) {\r\n  ctx.state={  \/\/\u5168\u5c40\u53d8\u91cf\uff0c\u5728ejs\u6a21\u677f\u4e2d\u53ef\u4ee5\u76f4\u63a5\u663e\u793a\u51fa\uff0c\u5982&lt;%= web %&gt;\r\n      web:'http:\/\/localhost:3000',\r\n      title:'111'\r\n  }\r\n  await next(); \/\/\u5fc5\u987b\u52a0\u8fd9\u4e2a\r\n});\r\n\r\nrouter.get('\/',async (ctx, next) =&gt; {\r\n  \/\/ctx.state,\u53ef\u4ee5\u83b7\u53d6\u5230\u521d\u59cb\u53d8\u91cf\r\n  ctx.type='json';\r\n  ctx.body={xx:'123'};\r\n});\r\n\r\nrouter.get('haha',async (ctx, next) =&gt; {\r\n  ctx.body='haha';\r\n});\r\n\r\n\r\n\r\n\r\n<\/pre>\n<p>\u6216\u8005<\/p>\n<pre>router.use(async (ctx,next)=&gt;{\r\n\r\n    \/\/\u5168\u5c40\u7684G\u53d8\u91cf\r\n    ctx.state.G={\r\n        url:'http:\/\/www.itying.com',\r\n        userinfo:111,\r\n        prevPage:222   \/*\u4e0a\u4e00\u9875\u7684\u5730\u5740*\/\r\n    }\r\n    await next();\r\n})\r\n\r\nrouter.use('\/',index.routes());\r\nrouter.use('\/admin',admin.routes());<\/pre>\n<p><span style=\"color: #ff0000;\">\u524d\u7f00<\/span><\/p>\n<pre>\u00a0const router = new Router({\r\n    prefix: '\/users'\r\n });\r\n\r\n router.get('\/', ...); \/\/\u5b9e\u9645\u7684\u54cd\u5e94\u8def\u5f84\u662f\uff1a\/users\r\n router.get('\/:id', ...); \/\/\u5b9e\u9645\u7684\u54cd\u5e94\u8def\u5f84\u662f\uff1a\/users\/:id<\/pre>\n<p><span style=\"color: #ff0000;\">\u4e3a\u4e00\u4e2a\u8def\u7531\u547d\u540d<\/span><\/p>\n<pre>router.get('home',':haha\/:vv', function (ctx, next) { \/\/\u4e3a\u9996\u9875\u7684\u8def\u7531\u547d\u540d\u4e3ahome\r\n ctx.body = 'Hello World!';\r\n router.url('home', 3,'age') \/\/\u7b2c\u4e00\u6b21\u53c2\u6570\u586b\u5199\u8def\u7531\u540d\u79f0\uff0c\u7b2c\u4e8c\u4e2a\u53c2\u6570\u5f00\u59cb\u586b\u5199\u81ea\u5b9a\u4e49\u53c2\u6570\uff0c\u8f93\u51fa:\/3\/age\r\n})<\/pre>\n<p><span style=\"color: #ff0000;\">\u8def\u7531\u4f7f\u7528\u4e2d\u95f4\u4ef6<\/span><\/p>\n<pre> router.use(session(), authorize()); \/\/\u6240\u6709\u8def\u7531\u90fd\u4f7f\u7528\u8fd9\u4e24\u4e2a\u4e2d\u95f4\u4ef6\r\n router.use('\/users', userAuth()); \/\/\u53ea\u6709\u8df3\u8f6c\u5230\/users\u9875\u9762\u65f6\u4f7f\u7528 \u8fd9\u4e2a\u4e2d\u95f4\u4ef6\r\n router.use(['\/users', '\/admin'], userAuth()); \/\/\u53ea\u6709\u8fd9\u4e24\u4e2a\u9875\u9762\u53ef\u4ee5\u4f7f\u7528\r\n app.use(router.routes()); \/\/\u4e0a\u9762\u662f\u8bbe\u7f6e\uff0c\u6b64\u6b65\u9aa4\u662f\u542f\u52a8<\/pre>\n<p>\u5355\u4e2a\u8def\u7531\u652f\u6301\u591a\u4e2a\u4e2d\u95f4\u4ef6\u6267\u884c<\/p>\n<pre>\/\/child.js\r\n\r\nfunction log( ctx ) {\r\n  console.log( '\u6267\u884c\u81ea\u5b9a\u4e49\u4e2d\u95f4\u4ef6' )\r\n}\r\n\r\nmodule.exports = function () {\r\n  return async function ( ctx, next ) {\r\n    log(ctx);\r\n    await next()\r\n  }\r\n};<\/pre>\n<pre>var child=require('.\/child');\r\n\r\nrouter.get('\/',\r\n  child(), \/\/\u4e00\u4e2a\u4e2d\u95f4\u4ef6\r\n  async (ctx,next)=&gt;{ \/\/\u4e00\u4e2a\u4e2d\u95f4\u4ef6\r\n     console.log(11111);\r\n     await next();\r\n  },\r\n  async (ctx, next) =&gt; {\r\n     await ctx.render('index',{\r\n       title:'xxxxx'\r\n     })\r\n});<\/pre>\n<p><span style=\"color: #ff0000;\">\u91cd\u5b9a\u5411\u3001\u9875\u9762\u8df3\u8f6c<\/span><\/p>\n<pre> ctx.redirect('http:\/\/localhost:3000\/www\/123\/456')<\/pre>\n<pre>app.use(async function (ctx,next) {   \/\/\u8bbf\u95ee\u5230\u9996\u9875\u5c31\u81ea\u52a8\u8df3\u8f6c\u5230\/wucg\u76ee\u5f55\u3002\u50cfapache\u3001nginx\u4e5f\u80fd\u5b9e\u73b0\r\n  if(ctx.originalUrl=='\/'){\r\n    ctx.response.redirect('\/wucg');\r\n  }\r\n  await next();\r\n});\r\n\r\nrouter.use('\/wucg',index.routes(),index2.routes());\r\nrouter.use('\/admin',admin.routes());\r\n\r\napp.use(router.routes(), router.allowedMethods());<\/pre>\n<p>\/\/<span style=\"color: #ff0000;\">\u8ba9\u9875\u9762\u62a5\u9519 \u629b\u9519<\/span><\/p>\n<pre>\/\/\u5168\u5c40\uff0c\u5728\u4e00\u4e2a\u8def\u7531\u4e0a\u8bbe\u7f6e\uff0c\u4f1a\u8ba9\u6240\u6709\u63a5\u53e3\u90fd\u62a5400\r\nctx.throw([msg],[status],[properties])\r\nctx.throw(400, 'name required');\r\n\r\n\/\/\u5c40\u90e8\uff0c\u5355\u4e2a\u63a5\u53e3\u62a5\u9519\r\nrouter.post('\/hnsy-app\/aed\/pageAedInfo',async (ctx, next)=&gt;{\r\n    await new Promise((a,b)=&gt;{\r\n\r\n        setTimeout(()=&gt;{\r\n            ctx.status=500\r\n            a()\r\n        },8000)\r\n\r\n    })\r\n\r\n})<\/pre>\n<p><span style=\"color: #ff0000;\">SSL\u3001https<\/span><\/p>\n<blockquote class=\"wp-embedded-content\" data-secret=\"tUoNpAIoAd\"><p><a href=\"https:\/\/sdeno.com\/?p=5814\">node.js\u914d\u7f6essl\u3001http2<\/a><\/p><\/blockquote>\n<p><iframe loading=\"lazy\" class=\"wp-embedded-content\" sandbox=\"allow-scripts\" security=\"restricted\" style=\"position: absolute; visibility: hidden;\" title=\"\u300anode.js\u914d\u7f6essl\u3001http2\u300b\u2014\u968f\u8eab\u7b14\u8bb0\" src=\"https:\/\/sdeno.com\/?p=5814&#038;embed=true#?secret=ipkD49yixc#?secret=tUoNpAIoAd\" data-secret=\"tUoNpAIoAd\" width=\"500\" height=\"282\" frameborder=\"0\" marginwidth=\"0\" marginheight=\"0\" scrolling=\"no\"><\/iframe><\/p>\n<p><span style=\"color: #ff0000;\">\u8def\u7531\u53c2\u6570\u9a8c\u8bc1<\/span><\/p>\n<p>\u8981\u8bbf\u95ee\u8be5\u5730\u5740\u4e4b\u524dhttp:\/\/127.0.0.1\/www\/\u53c2\u65701\/\u53c2\u65702\uff0c\u5148\u9a8c\u8bc1\u53c2\u65701\uff0c2\uff0c\u5728\u51b3\u5b9a\u662f\u5426\u5728\u8df3\u8f6c<\/p>\n<pre>router\r\n .param('ff', function (ff, ctx, next) {  \/\/\u53c2\u65701\u7684\u9a8c\u8bc1\u903b\u8f91\r\n      console.log(ff+'&lt;----------------');\r\n      return next();\r\n })\r\n .param('vv', function (vv, ctx, next) {  \/\/\u53c2\u65702\u7684\u9a8c\u8bc1\u903b\u8f91\r\n      console.log(vv+'&lt;----------------');\r\n      if (!vv) return ctx.status = 404;\r\n      return next();\r\n })\r\n .get('www\/:ff\/:vv', async function (ctx, next) {\r\n   \/\/ ctx.state = {\r\n     \/\/ title:'shouye1111'\r\n   \/\/ };\r\n\r\n     await ctx.render('index', {\r\n       title:'shouye1111'+ctx.params.ff\r\n     });\r\n})<\/pre>\n<p><span style=\"color: #ff0000;\">\u4e00\u4e2a\u8def\u7531\u4e1a\u52a1\u903b\u8f91\u5206\u79bb\u6210\u591a\u4e2a\u8def\u7531<\/span><\/p>\n<p>\u5047\u5982\u6211\u4eec\u5728\u5199\u540e\u53f0\u7684\u4e1a\u52a1\u903b\u8f91\u65f6\uff0c\u5f80\u5f80\u9700\u8981\u5f88\u591a\u5224\u65ad\uff0c\u6211\u4eec\u4e0d\u53ef\u80fd\u628a\u6240\u6709\u4ee3\u7801\u90fd\u5199\u8fdb\u4e00\u4e2a\u8def\u7531\u4e2d\uff0c\u65f6\u95f4\u957f\u4e86\u4ee3\u7801\u4e0d\u5bb9\u6613\u7ef4\u62a4\uff0c\u8fd9\u65f6\u5019\u6211\u4eec\u9700\u8981\u628a\u540e\u53f0\u7684\u4e1a\u52a1\u903b\u8f91\u540c\u65f6\u5206\u79bb\u5f52\u7c7b\u6210\u591a\u4e2a\u6587\u4ef6\uff0c\u7f16\u8f91\u6587\u4ef6app.js<\/p>\n<pre>const admin = require('.\/routes\/admin\/admin_login'); \/\/\u540e\u53f0\u767b\u9646\u9875\u9762\r\nconst admin_default = require('.\/routes\/admin\/admin_default'); \/\/\u540e\u53f0\u767b\u9646\u9875\u9762\u540e\u7684\u4e1a\u52a1\u903b\u8f91\r\n.\r\n.\r\n.\r\nrouter.use('\/admin', admin.routes(), admin.allowedMethods());\r\nrouter.use('\/admin', admin_default.routes(), admin_default.allowedMethods());<\/pre>\n<p>\u6216\u8005<\/p>\n<pre>const admin = require('.\/routes\/admin\/admin_login');\r\nrouter.use(admin.routes(), admin.allowedMethods());<\/pre>\n<p>\u7f16\u8f91\uff1a.\/routes\/admin\/admin_login.js\uff0c<\/p>\n<pre>const router = require('koa-router')()\r\nrouter.prefix('\/admin')  \/\/\u65b0\u589e<\/pre>\n<p>&#8212;&#8212;&#8212;&#8212;\u4ee5\u4e0a\u662f\u8def\u7531\u7684\u4f7f\u7528&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br \/>\n<span style=\"color: #ff0000;\">post\u548cget<\/span><\/p>\n<p>\u540e\u53f0\u83b7\u53d6\u5ba2\u6237\u7aefget\u53d1\u6765\u7684\u6570\u636e<br \/>\nctx.params \u00a0 \u00a0 \/\/\u83b7\u53d6\u5230\u7684\u662f\u4ee5\u8def\u7531 router.get(&#8216;\/:name&#8217;) \u5f62\u5f0f \u00a0 ,http:\/\/xxx\/<span style=\"color: #ff0000;\">123<\/span><\/p>\n<p>ctx.query \u00a0 \/\/{wo:&#8217;chen&#8217;,age:&#8217;123&#8242;} ,\u83b7\u53d6\u5230\u7684\u662furl\u8fd9\u6837\u4f20\u9012\u7684\u6570\u636e\uff0chttp:\/\/xxx\/1.php?<span style=\"color: #ff0000;\">wo=&#8217;chen&#8217;&amp;age=&#8217;123&#8242;<\/span><\/p>\n<p>\u540e\u53f0\u83b7\u53d6\u5ba2\u6237\u7aefpost\u53d1\u6765\u7684\u6570\u636e<br \/>\nctx.request.body<\/p>\n<p><span style=\"color: #ff0000;\">cookies\u7684\u8bbe\u7f6e\u548c\u83b7\u53d6<\/span><br \/>\nctx.cookies.set(&#8216;name&#8217;, &#8216;value&#8217;, {httpOnly:false}) \/\/\u8bbe\u7f6e {httpOnly:false}\uff0c\u8868\u793a\u53ef\u4ee5\u901a\u8fc7\u5ba2\u6237\u7aef\u83b7\u53d6cookies\u7684\u503c<br \/>\nsigned: \u662f\u5426\u8981\u505a\u7b7e\u540d<br \/>\nexpires: cookie \u6709\u6548\u671f\u65f6\u95f4<br \/>\npath: cookie \u7684\u8def\u5f84\uff0c\u9ed8\u8ba4\u4e3a \/&#8217;<br \/>\ndomain: cookie \u7684\u57df<br \/>\nsecure: false \u8868\u793a cookie \u901a\u8fc7 HTTP \u534f\u8bae\u53d1\u9001\uff0ctrue \u8868\u793a cookie \u901a\u8fc7 HTTPS \u53d1\u9001\u3002<br \/>\nhttpOnly: true \u8868\u793a cookie \u53ea\u80fd\u901a\u8fc7 HTTP \u534f\u8bae\u53d1\u9001<\/p>\n<p>\u4f8b\u5982\uff1a<\/p>\n<pre>ctx.cookies.set(\r\n 'state',\r\n 'hello world',\r\n {\r\n   domain: 'localhost', \/\/ \u5199cookie\u6240\u5728\u7684\u57df\u540d\r\n   path: '\/', \/\/ \u5199cookie\u6240\u5728\u7684\u8def\u5f84\r\n   maxAge:7200000, \/\/ 2\u5c0f\u65f6\u6709\u6548\r\n   expires: new Date('2017-07-15'), \/\/ cookie\u5931\u6548\u65f6\u95f4\r\n   httpOnly: false, \/\/ \u662f\u5426\u53ea\u7528\u4e8ehttp\u8bf7\u6c42\u4e2d\u83b7\u53d6\r\n   overwrite: false \/\/ \u662f\u5426\u5141\u8bb8\u91cd\u5199\r\n }\r\n)\r\n\r\nctx.cookies.set('token', response2.data.access_token,{maxAge:7200000}) \/\/2\u5c0f\u65f6\u6709\u6548<\/pre>\n<p>ctx.cookies.get(name, [options]) \/\/\u83b7\u53d6<\/p>\n<p><span style=\"color: #ff0000;\">session\u4f7f\u7528<\/span><\/p>\n<p>\u65b9\u6cd5\u4e00\uff1a<\/p>\n<pre>npm install koa-session --save  \/\/\u5b89\u88c5\r\n\r\n\/\/\u7f16\u8f91main.js\uff0c\u52a0\u5165\u4ee5\u4e0b\u5185\u5bb9\r\nconst session = require('koa-session');\r\n\r\napp.keys = ['some secret hurr'];\r\nconst CONFIG = {\r\n key: 'koa:sess', \/\/cookie key (default is koa:sess)\r\n maxAge: 86400000, \/\/ cookie\u7684\u8fc7\u671f\u65f6\u95f4 maxAge in ms (default is 1 days)\r\n overwrite: true, \/\/\u662f\u5426\u53ef\u4ee5overwrite (\u9ed8\u8ba4default true)\r\n httpOnly: true, \/\/cookie\u662f\u5426\u53ea\u6709\u670d\u52a1\u5668\u7aef\u53ef\u4ee5\u8bbf\u95ee httpOnly or not (default true)\r\n signed: true, \/\/\u7b7e\u540d\u9ed8\u8ba4true\r\n rolling: false, \/\/\u5728\u6bcf\u6b21\u8bf7\u6c42\u65f6\u5f3a\u884c\u8bbe\u7f6ecookie\uff0c\u8fd9\u5c06\u91cd\u7f6ecookie\u8fc7\u671f\u65f6\u95f4\uff08\u9ed8\u8ba4\uff1afalse\uff09\r\n renew: false, \/\/(boolean) renew session when session is nearly expired,\r\n};\r\napp.use(session(CONFIG, app));<\/pre>\n<p>\u65b9\u6cd5\u4e8c\uff1a<\/p>\n<pre> npm install koa2-cookie-session --save<\/pre>\n<pre>import session from \"koa2-cookie-session\"; \/\/\u4e00\u5b9a\u8981\u7528\u8fd9\u79cd\u65b9\u5f0f\u52a0\u8f7d\r\nvar router = require('koa-router')();\r\nrouter.use(session({\r\n  key: \"SESSIONID\", \/\/default \"koa:sid\"\r\n  expires:3, \/\/default 7\r\n  path:\"\/\" \/\/default \"\/\"\r\n}));\r\n\r\nrouter.get('home',':haha\/:vv',async function (ctx, next) {\r\n  ctx.session.user = {name: \"myname\u66f4\u65b0\"}; \/\/\u8bbe\u7f6e\r\n});\r\n\r\nctx.session.user \/\/\u83b7\u53d6<\/pre>\n<p><span style=\"color: #ff0000;\">api\u00a0\u63a5\u53e3<\/span><\/p>\n<pre>router.get('\/json', async (ctx, next) =&gt; {\r\n\r\n ctx.body = {\r\n   code:200,\r\n   title: 'koa2 json',\r\n   data:{\r\n    xx:1,\r\n    xx:2\r\n   }  \r\n }\r\n\r\n})<\/pre>\n<p><span style=\"color: #ff0000;\">\u751f\u6210log\u65e5\u5fd7\u6587\u4ef6<\/span><\/p>\n<p>\u4e0b\u8f7d\uff1a<a href=\"https:\/\/sdeno.com\/wp-content\/uploads\/2017\/01\/log.zip\">log<\/a><\/p>\n<p>1\uff0c\u5b89\u88c5\uff1anpm install &#8211;save log4js \/\/4.5.1<br \/>\n2\uff0c\u89e3\u538bzip\u628autils\u548cconfig\u76ee\u5f55\u653e\u5230\u6839\u76ee\u5f55\u4e0b<\/p>\n<pre>\/\/ logger\r\nconst logsUtil = require('.\/utils\/logs.js');\r\napp.use(async (ctx, next) =&gt; {\r\n    const start = new Date();              \/\/ \u54cd\u5e94\u5f00\u59cb\u65f6\u95f4\r\n    let intervals;                      \/\/ \u54cd\u5e94\u95f4\u9694\u65f6\u95f4\r\n    try {\r\n        await next();\r\n        intervals = new Date() - start;\r\n        logsUtil.logResponse(ctx, intervals);  \/\/\u8bb0\u5f55\u54cd\u5e94\u65e5\u5fd7\r\n    } catch (error) {\r\n        intervals = new Date() - start;\r\n        logsUtil.logError(ctx, error, intervals);\/\/\u8bb0\u5f55\u5f02\u5e38\u65e5\u5fd7\r\n    }\r\n})\r\n\r\n\r\nrouter.use('\/',index.routes(),index2.routes());\r\nrouter.use('\/admin',admin.routes());<\/pre>\n<p>\u542f\u52a8\u9879\u76ee\u540e\uff0c\u8bbf\u95ee\u4e0b\u7f51\u7ad9\u5c31\u4f1a\u5728\u6839\u76ee\u5f55\u4e0b\u751f\u6210logs\u76ee\u5f55\uff0c\u91cc\u9762\u5c31\u8bb0\u5f55\u8fd9log\u65e5\u5fd7\u6587\u4ef6\u4e86<\/p>\n<p>\u8bb0\u5f55\u6307\u5b9a\u8def\u7531\u65e5\u5fd7<br \/>\n\u4f8b\u5982routes\/index<\/p>\n<pre>const logsHandle = require(\"..\/utils\/logs.js\").logHandle;\r\nconst logsInfo = require(\"..\/utils\/logs.js\").logInfo;\r\n.\r\n.\r\n\r\nrouter.get('json', async (ctx, next) =&gt; {\r\n    logsHandle(\"\u8bf7\u6c42\u4e86json\u63a5\u53e3\")  \/\/ \u5047\u8bbe\u6b64\u5904\u9700\u8981\u8bb0\u5f55\u654f\u611f\u64cd\u4f5c\u7684\u65e5\u5fd7\r\n    logsInfo(\"\u8bf7\u6c42\u4e86json\u63a5\u53e3\")    \/\/ \u5047\u8bbe\u6b64\u5904\u9700\u8981\u5728\u63a7\u5236\u53f0\u6253\u5370\u65e5\u5fd7\r\n    ctx.body = {\r\n        title: 'koa2 json'\r\n    }\r\n})<\/pre>\n<p>\u65e5\u5fd7\u6253\u5370\u51fa<\/p>\n<figure class=\"mdx-lazyload-container\" style=\"max-width:445px\"><div style=\"padding-top:68.314606741573%\"><\/div><div class=\"mdx-img-loading-sp mdui-valign\"><div><div class=\"mdui-spinner\"><\/div><\/div><\/div><img width=\"445\" height=\"304\" class=\"alignnone size-full wp-image-7617 lazyload\" title=\"koa2\u7b14\u8bb0 koa-generator\u811a\u624b\u67b6\" src=\"data:image\/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\" data-src=\"https:\/\/sdeno.com\/wp-content\/uploads\/2017\/01\/loghand.png\" alt=\"https:\/\/sdeno.com\/wp-content\/uploads\/2017\/01\/loghand.png\" data-srcset=\"https:\/\/sdeno.com\/wp-content\/uploads\/2017\/01\/loghand.png 445w, https:\/\/sdeno.com\/wp-content\/uploads\/2017\/01\/loghand-300x205.png 300w\" sizes=\"auto, (max-width: 445px) 100vw, 445px\"><\/figure>\n<p><a href=\"https:\/\/www.cnblogs.com\/HoChine\/p\/10717831.html\" target=\"_blank\" rel=\"noopener\">https:\/\/www.cnblogs.com\/HoChine\/p\/10717831.html<\/a><\/p>\n<p><span style=\"color: #ff0000;\">\u81ea\u5b9a\u4e49404\u9875\u9762<\/span><br \/>\n(\u662f\u5f53\u7528\u6237\u4e71\u8f93\u5165url\u65f6\uff0c\u6ca1\u6709\u76f8\u5e94\u7684\u8def\u7531\u5339\u914d\u7684\u65f6\u5019\u624d\u8df3\u8f6c404\u9875\u9762)<\/p>\n<p>404\u9875\u9762\u4e5f\u53ef\u4ee5\u7528nginx\u3001apache\u6765\u5904\u7406<br \/>\n\u7f16\u8f91\u6587\u4ef6\uff1aapp.js<\/p>\n<pre>\/\/\u7f16\u8f91\u4ee5\u4e0b\u4ee3\u7801\r\napp.use(async (ctx, next) =&gt; {\r\n if (ctx.status === 404){\r\n    ctx.state={\r\n       title:'404\u9875\u9762'\r\n    };\r\n    await ctx.render('error', {  \/\/error\u4e3a\u4f60\u7684\u9519\u8bef\u9875\u9762\r\n    });\r\n }\r\n});\r\n\r\n\r\nmodule.exports = app;<\/pre>\n<p>\u63a5\u7740\u5728views\/error.ejs\uff0c\u521b\u5efa\u9519\u8bef\u9875\u9762\uff0c\u5373\u53ef\u3002<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #ff0000;\">\u81ea\u5b9a\u4e49\u63a5\u53e3\u9519\u8bef\u4fe1\u606f<\/span>\uff0c\u7f16\u8f91app.js<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">\/\/ \u8eab\u4efd\u8ba4\u8bc1\u9519\u8bef\u4e2d\u95f4\u4ef6\r\napp.use(async (ctx, next) =&gt; {\r\n    return next().catch(err =&gt; {\r\n        if (err.status === 401) {\r\n            \/\/ \u81ea\u5b9a\u4e49\u8fd4\u56de\u7ed3\u679c\r\n            ctx.status = 401;\r\n            console.log(err.name);\r\n            ctx.body = {\r\n                code: 401,\r\n                msg: err.message\r\n            };\r\n        } else {\r\n            throw err;\r\n        }\r\n    });\r\n});<\/pre>\n<p>\u6548\u679c\uff1a<\/p>\n<figure class=\"mdx-lazyload-container\" style=\"max-width:244px\"><div style=\"padding-top:39.754098360656%\"><\/div><div class=\"mdx-img-loading-sp mdui-valign\"><div><div class=\"mdui-spinner\"><\/div><\/div><\/div><img width=\"244\" height=\"97\" class=\"alignnone size-full wp-image-9155 lazyload\" title=\"koa2\u7b14\u8bb0 koa-generator\u811a\u624b\u67b6\" src=\"data:image\/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\" data-src=\"https:\/\/sdeno.com\/wp-content\/uploads\/2017\/01\/koaerro.png\" alt=\"https:\/\/sdeno.com\/wp-content\/uploads\/2017\/01\/koaerro.png\"><\/figure>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #ff0000;\">\u65f6\u95f4\u6233<\/span><\/p>\n<p>\u8fd9\u91cc\u63a8\u8350\u4f7f\u7528\u4e00\u6b3e\u6a21\u5757\u63d2\u4ef6<\/p>\n<p>\u5b89\u88c5\uff1a<\/p>\n<pre style=\"font-weight: 100; color: #222222;\"><code>npm install moment<\/code><\/pre>\n<p>\u52a0\u8f7d\u8c03\u7528\uff1a<\/p>\n<pre style=\"font-weight: 100; color: #222222;\"><code class=\"language-javascript\"><span class=\"keyword\">var<\/span> moment = require(<span class=\"string\" style=\"color: #cc3344;\">'moment'<\/span>);\r\nmoment().format();<\/code><\/pre>\n<p>\u6848\u4f8b\uff1a<\/p>\n<pre style=\"font-weight: 100; color: #222222;\"><code class=\"language-javascript\">moment().format('YYYY-M-DD kk:mm:ss');  \/\/2017-01-01 01:01:01<\/code><\/pre>\n<p>\u6587\u6863\uff1a<a href=\"http:\/\/momentjs.com\/docs\/#\/displaying\/\" target=\"_blank\" rel=\"noopener\">http:\/\/momentjs.com\/docs\/#\/displaying\/<\/a><\/p>\n<p><span style=\"color: #ff0000;\">\u4e0a\u4f20<\/span><\/p>\n<p>\u5b89\u88c5\uff1a<\/p>\n<pre style=\"color: #24292e;\"><code>npm install koa-body@2 --save<\/code><\/pre>\n<p>\u524d\u7aef\uff1a\u521b\u5efa\u9875\u9762views\/upload.ejs<\/p>\n<pre>&lt;!doctype html&gt;\r\n&lt;html&gt;\r\n&lt;body&gt;\r\n&lt;form action=\"<span style=\"color: #ff0000;\">\/upload<\/span>\" <span style=\"color: #ff0000;\">enctype=\"multipart\/form-data\"<\/span> method=\"post\"&gt;\r\n &lt;input type=\"text\" name=\"username\" placeholder=\"username\"&gt;&lt;br&gt;\r\n &lt;input type=\"text\" name=\"title\" placeholder=\"title of file\"&gt;&lt;br&gt;\r\n &lt;input type=\"file\" name=\"uploads\" multiple=\"multiple\"&gt;&lt;br&gt;\r\n &lt;button type=\"submit\"&gt;Upload&lt;\/button&gt;\r\n&lt;\/form&gt;\r\n&lt;\/body&gt;\r\n&lt;\/html&gt;<\/pre>\n<p>\u540e\u53f0\uff1aroutes\/index.js<\/p>\n<pre>router.get('\/haha',async function (ctx,next) { \r\n   await ctx.render('upload', {}); \r\n});\r\n\r\n\r\nrouter.post('upload',\r\n    koaBody({\r\n        multipart: true,\r\n        formidable: {\r\n            uploadDir:process.cwd() + '\/public\/upload',\r\n            keepExtensions:true,\r\n            onFileBegin: (name, file) =&gt; { \/\/ \u6587\u4ef6\u4e0a\u4f20\u524d\u7684\u8bbe\u7f6e\r\n                const fp = process.cwd() + '\/public\/upload';\r\n                if (!fs.existsSync(fp)) { \/\/ \u68c0\u67e5\u662f\u5426\u6709\u201cpublic\/upload\/\u201d\u6587\u4ef6\u5939\r\n                    fs.mkdirSync(fp); \/\/ \u6ca1\u6709\u5c31\u521b\u5efa\r\n                }\r\n            }\r\n        }\r\n    }),\r\n    async function (ctx,next) {\r\n        await new Promise((a,b)=&gt;{\r\n\r\n            if((ctx.request.body.files[\"file\"]).size==0){\r\n                fs.unlink((ctx.request.body.files[\"file\"]).path,function (err) {\r\n                    if(err) throw err;\r\n                    console.log('\u6210\u529f')\r\n                });\r\n\r\n            }\r\n            a();\r\n        });\r\n        ctx.body =ctx.request.body;\r\n    }\r\n\r\n)<\/pre>\n<p>\u8981\u6ce8\u610f\u63d0\u4ea4action\u7684\u8def\u5f84\u548c\u56fe\u7247\u4e0a\u4f20\u5230\u670d\u52a1\u5668\u7684\u8def\u5f84<\/p>\n<p>\u8bbf\u95eehttp:\/\/localhost:3000\/haha<\/p>\n<p>koa-body\u53c2\u6570\uff1a<\/p>\n<table style=\"height: 440px;\" width=\"1300\">\n<thead>\n<tr>\n<th>\u53c2\u6570\u540d<\/th>\n<th>\u63cf\u8ff0<\/th>\n<th>\u7c7b\u578b<\/th>\n<th>\u9ed8\u8ba4\u503c<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>patchNode<\/td>\n<td>\u5c06\u8865\u4e01\u5199\u5165ctx.req\u8282\u70b9\u4e2d<\/td>\n<td>Boolean<\/td>\n<td>false<\/td>\n<\/tr>\n<tr>\n<td>patchKoa<\/td>\n<td>\u5c06\u8865\u4e01\u5199\u5165ctx.request\u8282\u70b9\u4e2d<\/td>\n<td>Boolean<\/td>\n<td>true<\/td>\n<\/tr>\n<tr>\n<td>jsonLimit<\/td>\n<td>JSON \u6570\u636e\u4f53\u7684\u5927\u5c0f\u9650\u5236<\/td>\n<td>String \/ Integer<\/td>\n<td>1mb<\/td>\n<\/tr>\n<tr>\n<td>formLimit<\/td>\n<td>\u9650\u5236\u8868\u5355\u8bf7\u6c42\u4f53\u7684\u5927\u5c0f<\/td>\n<td>String \/ Integer<\/td>\n<td>56kb<\/td>\n<\/tr>\n<tr>\n<td>textLimit<\/td>\n<td>\u9650\u5236 text body \u7684\u5927\u5c0f<\/td>\n<td>String \/ Integer<\/td>\n<td>56kb<\/td>\n<\/tr>\n<tr>\n<td>encoding<\/td>\n<td>\u8868\u5355\u7684\u9ed8\u8ba4\u7f16\u7801<\/td>\n<td>String<\/td>\n<td>utf-8<\/td>\n<\/tr>\n<tr>\n<td>multipart<\/td>\n<td>\u662f\u5426\u652f\u6301 multipart-formdate \u7684\u8868\u5355<\/td>\n<td>Boolean<\/td>\n<td>false<\/td>\n<\/tr>\n<tr>\n<td>urlencoded<\/td>\n<td>\u662f\u5426\u652f\u6301 urlencoded \u7684\u8868\u5355<\/td>\n<td>Boolean<\/td>\n<td>true<\/td>\n<\/tr>\n<tr>\n<td>text<\/td>\n<td>\u662f\u5426\u89e3\u6790 text\/plain \u7684\u8868\u5355<\/td>\n<td>Boolean<\/td>\n<td>true<\/td>\n<\/tr>\n<tr>\n<td>json<\/td>\n<td>\u662f\u5426\u89e3\u6790 json \u8bf7\u6c42\u4f53<\/td>\n<td>Boolean<\/td>\n<td>true<\/td>\n<\/tr>\n<tr>\n<td>jsonStrict<\/td>\n<td>\u662f\u5426\u4f7f\u7528 json \u4e25\u683c\u6a21\u5f0f\uff0ctrue \u4f1a\u53ea\u5904\u7406\u6570\u7ec4\u548c\u5bf9\u8c61<\/td>\n<td>Boolean<\/td>\n<td>true<\/td>\n<\/tr>\n<tr>\n<td>formidable<\/td>\n<td>\u914d\u7f6e\u66f4\u591a\u7684\u5173\u4e8e multipart \u7684\u9009\u9879<\/td>\n<td>Object<\/td>\n<td><\/td>\n<\/tr>\n<tr>\n<td>onError<\/td>\n<td>\u9519\u8bef\u5904\u7406<\/td>\n<td>Function<\/td>\n<td><\/td>\n<\/tr>\n<tr>\n<td>stict<\/td>\n<td>\u4e25\u683c\u6a21\u5f0f,\u542f\u7528\u540e\u4e0d\u4f1a\u89e3\u6790 GET, HEAD, DELETE \u8bf7\u6c42<\/td>\n<td>Boolean<\/td>\n<td>true<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u5176\u4e2dformidable<\/p>\n<table style=\"height: 274px;\" width=\"1299\">\n<thead>\n<tr>\n<th>\u53c2\u6570\u540d<\/th>\n<th>\u63cf\u8ff0<\/th>\n<th>\u7c7b\u578b<\/th>\n<th>\u9ed8\u8ba4\u503c<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>maxFields<\/td>\n<td>\u9650\u5236\u5b57\u6bb5\u7684\u6570\u91cf<\/td>\n<td>Integer<\/td>\n<td>1000<\/td>\n<\/tr>\n<tr>\n<td>maxFieldsSize<\/td>\n<td>\u9650\u5236\u5b57\u6bb5\u7684\u6700\u5927\u503c<\/td>\n<td>Integer<\/td>\n<td>2mb (2 * 1024 * 1024)<\/td>\n<\/tr>\n<tr>\n<td>uploadDir<\/td>\n<td>\u8bbe\u7f6e\u6587\u4ef6\u4e0a\u4f20\u7684\u6587\u4ef6\u5939<\/td>\n<td>String<\/td>\n<td>os.tmpDir()<\/td>\n<\/tr>\n<tr>\n<td>keepExtensions<\/td>\n<td>\u4fdd\u7559\u539f\u6765\u7684\u6587\u4ef6\u540e\u7f00<\/td>\n<td>Boolean<\/td>\n<td>false<\/td>\n<\/tr>\n<tr>\n<td>hash<\/td>\n<td>\u5982\u679c\u5e0c\u671b\u8ba1\u7b97\u4f20\u5165\u6587\u4ef6\u7684\u6821\u9a8c\uff0c\u8bf7\u5c06\u5176\u8bbe\u7f6e\u4e3a\u201csha1\u201d\u6216\u201cmd5\u201d<\/td>\n<td>String<\/td>\n<td>false<\/td>\n<\/tr>\n<tr>\n<td>multipart<\/td>\n<td>\u662f\u5426\u652f\u6301\u591a\u6587\u4ef6\u4e0a\u4f20<\/td>\n<td>Boolean<\/td>\n<td>true<\/td>\n<\/tr>\n<tr>\n<td>onFileBegin<\/td>\n<td>\u5f00\u59cb\u65f6\u5bf9\u6587\u4ef6\u8fdb\u884c\u7279\u6b8a\u56de\u8c03\u3002\u5b83\u53ef\u4ee5\u7528\u4e8e\u5728\u5c06\u6587\u4ef6\u4fdd\u5b58\u5230\u78c1\u76d8\u4e4b\u524d\u91cd\u547d\u540d\u6587\u4ef6\u7b49<\/td>\n<td>Function<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u6848\u4f8b\uff1a<\/p>\n<p>\u63a8\u8350\u628abodyparse\u52a0\u8f7d\u5230app.js\u91cc\u9762\u7684\u5168\u5c40\u4e2d\uff0c\u4e0d\u7136\u6bcf\u4e2arouter\u90fd\u8981\u52a0\u8f7d\u624d\u80fd\u83b7\u53d6post\u4f20\u6765\u7684\u6570\u636e\u4e0d\u73b0\u5b9e<\/p>\n<pre>app.use(koaBody({\r\n    multipart: true,\r\n    formidable: {\r\n        uploadDir:process.cwd() + '\/public\/upload',\r\n        keepExtensions:true,\r\n        onFileBegin: (name, file) =&gt; { \/\/ \u6587\u4ef6\u4e0a\u4f20\u524d\u7684\u8bbe\u7f6e\r\n            const fp = process.cwd() + '\/public\/upload';\r\n            if (!fs.existsSync(fp)) { \/\/ \u68c0\u67e5\u662f\u5426\u6709\u201cpublic\/upload\/\u201d\u6587\u4ef6\u5939\r\n                fs.mkdirSync(fp); \/\/ \u6ca1\u6709\u5c31\u521b\u5efa\r\n            }\r\n            \/\/ console.log(`bodyparse: name:${name}; file:${util.inspect(file)}`);\r\n        }\r\n    }\r\n}));<\/pre>\n<p><a href=\"https:\/\/blog.csdn.net\/weixin_40415614\/article\/details\/84783723\" target=\"_blank\" rel=\"noopener\">https:\/\/blog.csdn.net\/weixin_40415614\/article\/details\/84783723<\/a><\/p>\n<p><span style=\"color: #ff0000;\">\u4e0a\u4f20base64\u56fe\u7247<\/span><\/p>\n<p>base64\u7684\u5f62\u5f0f\u4e3a\u201cdata:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0\u3002\u3002\u3002\u3002\u201d\uff1b<br \/>\n\u5f53\u63a5\u6536\u5230\u4e0a\u8fb9\u7684\u5185\u5bb9\u540e\uff0c\u9700\u8981\u5c06data:image\/png;base64,\u8fd9\u6bb5\u5185\u5bb9\u8fc7\u6ee4\u6389\uff0c\u8fc7\u6ee4\u6210\uff1a\u201ciVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0\u3002\u3002\u3002\u201d\uff1b\u4f20\u7ed9\u540e\u53f0<\/p>\n<p>\u524d\u7aef:<\/p>\n<pre>&lt;form action=\"\/uploadbase64\" enctype=\"multipart\/form-data\" method=\"post\"&gt;\r\n  &lt;input value=\"\" name=\"baseimg\" hidden id=\"baseimg\"&gt;\r\n  &lt;input id=\"fielinput\" type=\"file\" multiple=\"multiple\" accept=\"image\/*\" onchange=\"showPreview(this)\"&gt;&lt;br&gt;\r\n  &lt;img id=\"fielImg\" src=\"\" \/&gt;\r\n  &lt;button&gt;Upload&lt;\/button&gt;\r\n&lt;\/form&gt;\r\n\r\n\r\n<\/pre>\n<pre>&lt;script&gt;\r\n    function showPreview(source) {\r\n        var file = source.files[0];\r\n        \/\/\u5224\u65ad\u6587\u4ef6\u7c7b\u578b\r\n        var extfile = file.name;\r\n        var AllImgExt=\".jpg|.jpeg|.gif|.bmp|.png|\";\r\n        var extName = extfile.substring(extfile.lastIndexOf(\".\")).toLowerCase();\/\/\uff08\u628a\u8def\u5f84\u4e2d\u7684\u6240\u6709\u5b57\u6bcd\u5168\u90e8\u8f6c\u6362\u4e3a\u5c0f\u5199\uff09\r\n        if(AllImgExt.indexOf(extName+\"|\")==-1)\r\n        {\r\n            var ErrMsg=\"\u8be5\u6587\u4ef6\u7c7b\u578b\u4e0d\u5141\u8bb8\u4e0a\u4f20\u3002\u8bf7\u4e0a\u4f20 \"+AllImgExt+\" \u7c7b\u578b\u7684\u6587\u4ef6\uff0c\u5f53\u524d\u6587\u4ef6\u7c7b\u578b\u4e3a\"+extName;\r\n            alert(ErrMsg);\r\n            return false;\r\n        }\r\n        if(window.FileReader) {\r\n            var fr = new FileReader();\r\n            fr.readAsDataURL(file);\r\n            fr.onloadend = function(e) {\r\n                document.getElementById(\"fielImg\").src = e.target.result;\r\n                document.getElementById(\"baseimg\").value = e.target.result;\r\n            };\r\n        }else{\r\n            alert('\u6d4f\u89c8\u5668\u4e0d\u652f\u6301\u9884\u89c8\u56fe\u7247');\r\n        }\r\n    };\r\n\r\n&lt;\/script&gt;<\/pre>\n<p>\u540e\u53f0\uff1a<\/p>\n<pre>router.post('uploadbase64',async (ctx, next) =&gt; {\r\n\r\n    var imgData=ctx.request.body.fields.baseimg;\r\n    var reg=\/^data:image\\\/(\\w+);base64,\/;  \/\/\u4f20\u7ed9\u540e\u53f0\u7684base64\uff0c\u524d\u9762\u8fd9\u90e8\u5206\u7684\u4e0d\u8981\uff0c\u524d\u7aef\u663e\u793a\u624d\u9700\u8981\r\n    var base64Data = imgData.replace(reg, \"\");\r\n    var imgtype=RegExp.lastParen; \/\/\u83b7\u53d6\u5230\u62ec\u53f7\u7684\u5b57\u7b26\u4e32\r\n\r\n\r\n   \/\/ var dataBuffer = new Buffer(base64Data, 'base64');  \/\/\u4e5f\u53ef\u4ee5\u7528\uff0c\u4f46\u662f\u4f1a\u63d0\u793a\u6709\u5b89\u5168\u95ee\u9898\r\n    var dataBuffer =Buffer.from(base64Data, 'base64');\r\n    fs.writeFile(process.cwd() + '\/public\/upload\/image.'+imgtype, dataBuffer, function(err) {\r\n        \/\/ if(err){\r\n        \/\/     res.send(err);\r\n        \/\/ }else{\r\n        \/\/     res.send(\"\u4fdd\u5b58\u6210\u529f\uff01\");\r\n        \/\/ }\r\n    });\r\n    \r\n\r\n    ctx.body =ctx.request.body;\r\n});<\/pre>\n<p><span style=\"color: #ff0000;\">\u4e0b\u8f7d<\/span><\/p>\n<blockquote class=\"wp-embedded-content\" data-secret=\"Io0jySlTsA\"><p><a href=\"https:\/\/sdeno.com\/?p=7553\">\u53e6\u5b58\u4e3a\u6548\u679c<\/a><\/p><\/blockquote>\n<p><iframe loading=\"lazy\" class=\"wp-embedded-content\" sandbox=\"allow-scripts\" security=\"restricted\" style=\"position: absolute; visibility: hidden;\" title=\"\u300a\u53e6\u5b58\u4e3a\u6548\u679c\u300b\u2014\u968f\u8eab\u7b14\u8bb0\" src=\"https:\/\/sdeno.com\/?p=7553&#038;embed=true#?secret=UKx8m31QNH#?secret=Io0jySlTsA\" data-secret=\"Io0jySlTsA\" width=\"500\" height=\"282\" frameborder=\"0\" marginwidth=\"0\" marginheight=\"0\" scrolling=\"no\"><\/iframe><\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #ff0000;\">\u63a5\u53e3\u6a21\u62df\u5ef6\u8fdf<\/span><\/p>\n<pre>router.post('\/syldmh-web\/service\/wdzhq\/getTopicData',async (ctx,next) =&gt;{\r\n\r\n async function delay(time) {\r\n  return new Promise(function(resolve, reject) {\r\n     setTimeout(function(){\r\n        resolve();\r\n     }, time);\r\n  });\r\n };\r\n await delay(4000);\r\n\r\n ctx.body = {}\r\n\r\n})<\/pre>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #ff0000;\">\u56fe\u7247\u538b\u7f29\u00a0<\/span><\/p>\n<p>\u4f7f\u7528\u7b2c\u4e09\u65b9\uff1a<a href=\"https:\/\/tinypng.com\/developers\/reference\/nodejs\" target=\"_blank\" rel=\"noopener\">https:\/\/tinypng.com\/developers\/reference\/nodejs<\/a><\/p>\n<p>\u5b89\u88c5\uff1anpm install &#8211;save tinify<\/p>\n<p>\u5728 app.js<\/p>\n<pre>const tinify = require(\"tinify\");\r\ntinify.key = \"API Key\";<\/pre>\n<p>\u4e0a\u4f20\u63a5\u53e3\uff1a<\/p>\n<pre>const tinify = require(\"tinify\");\r\n.\r\n.\r\nrouter.post('upload',koaBody({\r\n   multipart: true,\r\n   formidable: {\r\n     uploadDir:process.cwd() + '\/public\/upload',\r\n     keepExtensions:true,\r\n     onFileBegin: (name, file) =&gt; { \/\/ \u6587\u4ef6\u4e0a\u4f20\u524d\u7684\u8bbe\u7f6e\r\n       const fp = process.cwd() + '\/public\/upload';\r\n       if (!fs.existsSync(fp)) { \/\/ \u68c0\u67e5\u662f\u5426\u6709\u201cpublic\/upload\/\u201d\u6587\u4ef6\u5939\r\n         fs.mkdirSync(fp); \/\/ \u6ca1\u6709\u5c31\u521b\u5efa\r\n       }\r\n     }\r\n   }\r\n}),async (ctx, next) =&gt; {\r\n\r\n  if( !!ctx.request.body.files[\"file\"].length ){ \/\/\u591a\u56fe\u7247\r\n    for(let i=0;i&lt;ctx.request.body.files[\"file\"].length;i++){\r\n      fs.readFile(ctx.request.body.files['file'][i].path, function(err, sourceData) {\r\n        if (err) throw err;\r\n        tinify.fromBuffer(sourceData).toBuffer(function(err, resultData) {\r\n          if (err) throw err;\r\n          console.log(resultData);\r\n          fs.writeFile(ctx.request.body.files['file'][i].path, resultData, function(err) { \/\/\u538b\u7f29\u540e\u8986\u76d6\u539f\u56fe\r\n             console.log('\u8986\u76d6\u6210\u529f');\r\n          });\r\n        });\r\n      });\r\n     }\r\n  }else{ \/\/\u5355\u56fe\u7247\r\n     fs.readFile(ctx.request.body.files['file'].path, function(err, sourceData) {\r\n       if (err) throw err;\r\n       tinify.fromBuffer(sourceData).toBuffer(function(err, resultData) {\r\n          if (err) throw err;\r\n          console.log(resultData);\r\n          fs.writeFile(ctx.request.body.files['file'].path, resultData, function(err) { \/\/\u538b\u7f29\u540e\u8986\u76d6\u539f\u56fe\r\n             console.log('\u8986\u76d6\u6210\u529f');\r\n          });\r\n       });\r\n      });\r\n    }\r\n\r\n   ctx.body =ctx.request.body;\r\n});<\/pre>\n<p><span style=\"color: #ff0000;\">\u542f\u52a8\u670d\u52a1\u5668\u4ec5\u6267\u884c\u4e00\u6b21<\/span><\/p>\n<pre>console.log('\u53ea\u4f1a\u6267\u884c\u4e00\u6b21');\r\n\r\napp.use(async function (ctx,next) {\r\n  await next();\r\n});<\/pre>\n<p>\u53ea\u8981\u4e0d\u628a\u4ee3\u7801\u5199\u5728\u4e2d\u95f4\u4ef6\u91cc\u9762\uff0c\u53ea\u6709koa\u542f\u52a8\u65f6\u6267\u884c\u4e00\u6b21<\/p>\n<p><span style=\"color: #ff0000;\">\u6587\u672c\u7f16\u8f91\u5668wangeditor2<\/span><\/p>\n<p><a href=\"http:\/\/www.kancloud.cn\/wangfupeng\/wangeditor2\/113964\" target=\"_blank\" rel=\"noopener\">http:\/\/www.kancloud.cn\/wangfupeng\/wangeditor2\/113964<\/a><\/p>\n<p><a href=\"https:\/\/github.com\/wangfupeng1988\/wangEditor\" target=\"_blank\" rel=\"noopener\">https:\/\/github.com\/wangfupeng1988\/wangEditor<\/a><\/p>\n<p>\u52a0\u8f7d\u5fc5\u8981\u63d2\u4ef6\uff1a<\/p>\n<p><a href=\"https:\/\/github.com\/wangfupeng1988\/wangEditor\/tree\/master\/test\/plupload\/lib\/plupload\">https:\/\/github.com\/wangfupeng1988\/wangEditor\/tree\/master\/test\/plupload\/lib\/plupload<\/a><\/p>\n<pre style=\"color: #222222;\"><code class=\"html language-html hljs xml\" style=\"color: #4d4d4c;\"><span class=\"hljs-comment\" style=\"color: #8e908c;\">&lt;!--\u5f15\u5165wangEditor.css--&gt;<\/span>\r\n<span class=\"hljs-tag\" style=\"color: #c82829;\">&lt;<span class=\"hljs-title\">link<\/span> <span class=\"hljs-attribute\">rel<\/span>=<span class=\"hljs-value\" style=\"color: #718c00;\">\"stylesheet\"<\/span> <span class=\"hljs-attribute\">type<\/span>=<span class=\"hljs-value\" style=\"color: #718c00;\">\"text\/css\"<\/span> <span class=\"hljs-attribute\">href<\/span>=<span class=\"hljs-value\" style=\"color: #718c00;\">\"..\/dist\/css\/wangEditor.min.css\"<\/span>&gt;<\/span>\r\n\r\n&lt;div id=\"div1\"&gt;\r\n &lt;p&gt;\u8bf7\u8f93\u5165\u5185\u5bb9...&lt;\/p&gt;\r\n&lt;\/div&gt;\r\n<span class=\"hljs-comment\" style=\"color: #8e908c;\">&lt;!--\u5f15\u5165jquery\u548cwangEditor.js--&gt;<\/span>   <span class=\"hljs-comment\" style=\"color: #8e908c;\">&lt;!--\u6ce8\u610f\uff1ajavascript\u5fc5\u987b\u653e\u5728body\u6700\u540e\uff0c\u5426\u5219\u53ef\u80fd\u4f1a\u51fa\u73b0\u95ee\u9898--&gt;<\/span>\r\n<span class=\"hljs-tag\" style=\"color: #c82829;\">&lt;<span class=\"hljs-title\">script<\/span> <span class=\"hljs-attribute\">type<\/span>=<span class=\"hljs-value\" style=\"color: #718c00;\">\"text\/javascript\"<\/span> <span class=\"hljs-attribute\">src<\/span>=<span class=\"hljs-value\" style=\"color: #718c00;\">\"..\/dist\/js\/lib\/jquery-1.10.2.min.js\"<\/span>&gt;<\/span><span class=\"hljs-tag\" style=\"color: #c82829;\">&lt;\/<span class=\"hljs-title\">script<\/span>&gt;\r\n<\/span><span class=\"hljs-tag\" style=\"color: #c82829;\">&lt;<span class=\"hljs-title\">script<\/span> <span class=\"hljs-attribute\">type<\/span>=<span class=\"hljs-value\" style=\"color: #718c00;\">\"text\/javascript\"<\/span> <span class=\"hljs-attribute\">src<\/span>=<span class=\"hljs-value\" style=\"color: #718c00;\">\"lib\/plupload\/plupload.full.min.js\"<\/span>&gt;<\/span><span class=\"hljs-tag\" style=\"color: #c82829;\">&lt;\/<span class=\"hljs-title\">script<\/span>&gt;<\/span>\r\n<span class=\"hljs-tag\" style=\"color: #c82829;\">&lt;<span class=\"hljs-title\">script<\/span> <span class=\"hljs-attribute\">type<\/span>=<span class=\"hljs-value\" style=\"color: #718c00;\">\"text\/javascript\"<\/span> <span class=\"hljs-attribute\">src<\/span>=<span class=\"hljs-value\" style=\"color: #718c00;\">\"..\/dist\/js\/wangEditor.min.js\"<\/span>&gt;<\/span><span class=\"hljs-tag\" style=\"color: #c82829;\">&lt;\/<span class=\"hljs-title\">script<\/span>&gt;\r\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-title\">script<\/span> <span class=\"hljs-attribute\">type<\/span>=<span class=\"hljs-value\" style=\"color: #718c00;\">\"text\/javascript\"<\/span>&gt;<\/span><span class=\"actionscript\"> \r\nfunction printLog(title, info) {\r\n window.console &amp;&amp; console.log(title, info);\r\n}\r\n\r\n\/\/ ------- \u914d\u7f6e\u4e0a\u4f20\u7684\u521d\u59cb\u5316\u4e8b\u4ef6 -------\r\nfunction uploadInit () {\r\n \/\/ this \u5373 editor \u5bf9\u8c61\r\n var editor = this;\r\n \/\/ \u7f16\u8f91\u5668\u4e2d\uff0c\u89e6\u53d1\u9009\u62e9\u56fe\u7247\u7684\u6309\u94ae\u7684id\r\n var btnId = editor.customUploadBtnId;\r\n \/\/ \u7f16\u8f91\u5668\u4e2d\uff0c\u89e6\u53d1\u9009\u62e9\u56fe\u7247\u7684\u6309\u94ae\u7684\u7236\u5143\u7d20\u7684id\r\n var containerId = editor.customUploadContainerId;\r\n\r\n \/\/\u5b9e\u4f8b\u5316\u4e00\u4e2a\u4e0a\u4f20\u5bf9\u8c61\r\n var uploader = new plupload.Uploader({\r\n browse_button: btnId, \/\/ \u9009\u62e9\u6587\u4ef6\u7684\u6309\u94ae\u7684id\r\n url: '\/admin\/upload', \/\/ \u670d\u52a1\u5668\u7aef\u7684\u4e0a\u4f20\u5730\u5740\r\n flash_swf_url: '\/plupload\/lib\/plupload\/Moxie.swf',\r\n sliverlight_xap_url: '\/plupload\/lib\/plupload\/Moxie.xap',\r\n filters: {\r\n mime_types: [\r\n \/\/\u53ea\u5141\u8bb8\u4e0a\u4f20\u56fe\u7247\u6587\u4ef6 \uff08\u6ce8\u610f\uff0cextensions\u4e2d\uff0c\u9017\u53f7\u540e\u9762\u4e0d\u8981\u52a0\u7a7a\u683c\uff09\r\n { title: \"\u56fe\u7247\u6587\u4ef6\", extensions: \"jpg,gif,png,bmp\" }\r\n ]\r\n }\r\n });\r\n\r\n \/\/\u5b58\u50a8\u6240\u6709\u56fe\u7247\u7684url\u5730\u5740\r\n var urls = [];\r\n\r\n \/\/\u521d\u59cb\u5316\r\n uploader.init();\r\n\r\n \/\/\u7ed1\u5b9a\u6587\u4ef6\u6dfb\u52a0\u5230\u961f\u5217\u7684\u4e8b\u4ef6\r\n uploader.bind('FilesAdded', function (uploader, files) {\r\n \/\/\u663e\u793a\u6dfb\u52a0\u8fdb\u6765\u7684\u6587\u4ef6\u540d\r\n $.each(files, function(key, value){\r\n printLog('\u6dfb\u52a0\u6587\u4ef6' + value.id);\r\n });\r\n\r\n \/\/ \u6587\u4ef6\u6dfb\u52a0\u4e4b\u540e\uff0c\u5f00\u59cb\u6267\u884c\u4e0a\u4f20\r\n uploader.start();\r\n });\r\n\r\n \/\/\u5355\u4e2a\u6587\u4ef6\u4e0a\u4f20\u4e4b\u540e\r\n uploader.bind('FileUploaded', function (uploader, file, responseObject) {\r\n \/\/\u6ce8\u610f\uff0c\u8981\u4ece\u670d\u52a1\u5668\u8fd4\u56de\u56fe\u7247\u7684url\u5730\u5740\uff0c\u5426\u5219\u4e0a\u4f20\u7684\u56fe\u7247\u65e0\u6cd5\u663e\u793a\u5728\u7f16\u8f91\u5668\u4e2d\r\n var url = responseObject.response;\r\n \/\/\u5148\u5c06url\u5730\u5740\u5b58\u50a8\u6765\uff0c\u5f85\u6240\u6709\u56fe\u7247\u90fd\u4e0a\u4f20\u5b8c\u4e86\uff0c\u518d\u7edf\u4e00\u5904\u7406\r\n urls.push(url);\r\n\r\n printLog('\u4e00\u4e2a\u56fe\u7247\u4e0a\u4f20\u5b8c\u6210\uff0c\u8fd4\u56de\u7684url\u662f' + url);\r\n });\r\n\r\n \/\/\u5168\u90e8\u6587\u4ef6\u4e0a\u4f20\u65f6\u5019\r\n uploader.bind('UploadComplete', function (uploader, files) {\r\n printLog('\u6240\u6709\u56fe\u7247\u4e0a\u4f20\u5b8c\u6210');\r\n\r\n \/\/ \u7528 try catch \u517c\u5bb9IE\u4f4e\u7248\u672c\u7684\u5f02\u5e38\u60c5\u51b5\r\n try {\r\n \/\/\u6253\u5370\u51fa\u6240\u6709\u56fe\u7247\u7684url\u5730\u5740\r\n console.log(urls)\r\n $.each(urls, function (key, value) {\r\n printLog('\u5373\u5c06\u63d2\u5165\u56fe\u7247' + value);\r\n\r\n \/\/ \u63d2\u5165\u5230\u7f16\u8f91\u5668\u4e2d\r\n \/\/editor.command(null, 'insertHtml', '&lt;img src=\"' + value + '\" style=\"max-width:100%;\"\/&gt;');\r\n editor.$txt.append('&lt;img src=\"' + value + '\" style=\"max-width:100%;\"\/&gt;');\r\n });\r\n } catch (ex) {\r\n \/\/ \u6b64\u5904\u53ef\u4e0d\u5199\u4ee3\u7801\r\n } finally {\r\n \/\/\u6e05\u7a7aurl\u6570\u7ec4\r\n urls = [];\r\n\r\n \/\/ \u9690\u85cf\u8fdb\u5ea6\u6761\r\n editor.hideUploadProgress();\r\n }\r\n });\r\n\r\n \/\/ \u4e0a\u4f20\u8fdb\u5ea6\u6761\r\n uploader.bind('UploadProgress', function (uploader, file) {\r\n \/\/ \u663e\u793a\u8fdb\u5ea6\u6761\r\n editor.showUploadProgress(file.percent);\r\n });\r\n}\r\n\r\n\r\n\/\/ ------- \u521b\u5efa\u7f16\u8f91\u5668 -------\r\nvar editor = new wangEditor('div1');\r\neditor.config.customUpload = true; \/\/ \u914d\u7f6e\u81ea\u5b9a\u4e49\u4e0a\u4f20\u7684\u5f00\u5173\r\neditor.config.customUploadInit = uploadInit; \/\/ \u914d\u7f6e\u4e0a\u4f20\u4e8b\u4ef6\uff0cuploadInit\u65b9\u6cd5\u5df2\u7ecf\u5728\u4e0a\u9762\u5b9a\u4e49\u4e86\r\neditor.create();\r\n<\/span><span class=\"hljs-tag\">&lt;\/<span class=\"hljs-title\">script<\/span>&gt;<\/span><\/span><\/code><\/pre>\n<p>admin\/upload\u9875\u9762<\/p>\n<pre>\/\/\u7f16\u8f91\u5668\u4e2d\u7684\u4e0a\u4f20\uff0c\u652f\u6301\u5355\u3001\u591a\u6587\u4ef6\u4e0a\u4f20\r\nrouter.post('\/upload',\r\n koaBody({\r\n multipart: true,\r\n formidable: {\r\n uploadDir:path.join(process.cwd(), '\/public\/images')\r\n }\r\n }),\r\n async function (ctx,next) {\r\n\r\n \/\/console.log(ctx.request.body.fields);\r\n \/\/ =&gt; {username: \"\"} - if empty\r\n \/\/console.log( ((((ctx.request.body.files[\"file\"])).name).split('.'))[(((((ctx.request.body.files[\"file\"])).name).split('.')).length-1)] );\r\n \/\/console.log( (((ctx.request.body.files)[\"uploads\"])).path );\r\n \/\/ console.log( (((((ctx.request.body.files)[\"uploads\"])).name).split('.'))[(((((ctx.request.body.files)[\"uploads\"])).name).split('.')).length-1] );\r\n \/* =&gt; {uploads: [\r\n {\r\n \"size\": 748831,\r\n \"path\": \"\/tmp\/f7777b4269bf6e64518f96248537c0ab.png\",\r\n \"name\": \"some-image.png\",\r\n \"type\": \"image\/png\",\r\n \"mtime\": \"2014-06-17T11:08:52.816Z\"\r\n },\r\n {\r\n \"size\": 379749,\r\n \"path\": \"\/tmp\/83b8cf0524529482d2f8b5d0852f49bf.jpeg\",\r\n \"name\": \"nodejs_rulz.jpeg\",\r\n \"type\": \"image\/jpeg\",\r\n \"mtime\": \"2014-06-17T11:08:52.830Z\"\r\n }\r\n ]}\r\n *\/\r\n \/\/ ctx.body = JSON.stringify(ctx.request.body, null, 2)\r\n\r\n await new Promise((a,b)=&gt;{\r\n    cox.body='http:\/\/www.xxx.com\/1.jpg'\r\n })\r\n }\r\n)<\/pre>\n<p><span style=\"color: #ff0000;\">\u9a8c\u8bc1\u7801<\/span><\/p>\n<p><a href=\"https:\/\/sdeno.com\/?p=5425\" target=\"_blank\" rel=\"noopener\">https:\/\/sdeno.com\/?p=5425<\/a><\/p>\n<p><span style=\"color: #ff0000;\">\u52a0\u5bc6<\/span><\/p>\n<pre>var crypto = require('crypto');  \/\/node.js\u5185\u7f6e\r\nmodule.exports = function(pwd) {\r\n  var hash = crypto.createHash('sha256').update(pwd).digest('base64');\r\n  return hash;\r\n};<\/pre>\n<p><span style=\"color: #ff0000;\">\u9a8c\u8bc1token<\/span><\/p>\n<p>\u300a<a href=\"https:\/\/sdeno.com\/?p=6397\" target=\"_blank\" rel=\"noopener\">node.js\u5b9e\u73b0token\u8eab\u4efd\u9a8c\u8bc1<\/a>\u300b<\/p>\n<p><span style=\"color: #ff0000;\">\u624b\u673a\u9875\u9762<\/span><\/p>\n<p>\u4f7f\u7528pc\u7aef\u6216\u8005\u624b\u673a\u7aef\u8bbf\u95ee\u53ef\u4ee5\u667a\u80fd\u5224\u65ad\u5207\u6362\u9875\u9762\uff0c\u5b9e\u73b0\u65b9\u6cd5\u67092\u79cd\uff1a<\/p>\n<p>1\uff0c\u5728\u5ba2\u6237\u7aef\u9876\u90e8\u6dfb\u52a0js\u6765\u5224\u65adpc\u3001\u624b\u673a\u7aef\u6765\u5b9e\u73b0\u57df\u540d\u8df3\u8f6c\uff0c\u6765\u8bbf\u95ee\u4e0d\u540c\u9875\u9762\u3002\u597d\u5904\u5c31\u662f\u8ba9\u670d\u52a1\u5668\u51cf\u8f7b\u8d1f\u62c5\uff0c\u574f\u5904\u5c31\u662f\u57df\u540d\u53d1\u751f\u8df3\u8f6c\u3002<\/p>\n<p>2\uff0c\u5728\u540e\u53f0\u5224\u65ad\u6765\u5b9e\u73b0\u52a0\u8f7dpc\u3001\u624b\u673a\u7aef\u6a21\u7248\uff0c\u597d\u5904\u662f\u57df\u540d\u59cb\u7ec8\u4e0d\u53d8\u3002\u574f\u5904\u5c31\u662f\uff0c\u7a0d\u5fae\u7ed9\u670d\u52a1\u5668\u6dfb\u52a0\u4e00\u4e9b\u8d1f\u62c5\u3002<\/p>\n<pre>npm install koa2-useragent --save<\/pre>\n<p>\/\/\u7f16\u8f91app.js<\/p>\n<pre>const Koa = require('koa');\r\n.\r\n.\r\n.\r\nimport userAgent from 'koa2-useragent';\r\napp.use(userAgent());<\/pre>\n<p>\/\/\u8def\u7531<\/p>\n<pre>router.get('\/', async function (ctx, next) {\r\n    console.log(ctx.userAgent);\r\n    .\r\n    .\r\n    .\r\n    if(ctx.userAgent.isMobile){  \/\/\u5ba2\u6237\u7aef\u4e0d\u540c\uff0c\u5e94\u7528\u4e0d\u540c\u6a21\u677f\r\n         await ctx.render('mobile_index.ejs', {\r\n         });\r\n    }else{\r\n         await ctx.render('home_index', {\r\n         });\r\n    }\r\n})<\/pre>\n<p><a href=\"https:\/\/www.npmjs.com\/package\/koa2-useragent\">https:\/\/www.npmjs.com\/package\/koa2-useragent<\/a><\/p>\n<p><span style=\"color: #ff0000;\">\u5b50\u8fdb\u7a0b<\/span><br \/>\n\u4e00\u4e9b\u7e41\u91cd\u7684\u4e1a\u52a1\u903b\u8f91\u7ed9\u5b50\u7ebf\u7a0b\u53bb\u505a\u7136\u540e\u4f20\u56de\u7ed9\u4e3b\u7ebf\u7a0b\uff0c\u9632\u6b62\u4e3b\u7ebf\u7a0b\u6302\u58c1<\/p>\n<p>\/\/\u7236\u4eb2<\/p>\n<pre>var childProcess = require('child_process');\r\n.\r\n.\r\nrouter.get('\/',async (ctx, next) =&gt; {\r\n  await new Promise((a,b)=&gt;{\r\n    childProcess.fork(process.cwd()+'\/routes\/child.js',[]).on('message', function(m) {\r\n       console.log('\u513f\u5b50\u53d1\u6765\u7684\u4fe1\u606f: ', m); \/\/\u6b64\u5904\u662f\uff0c\u8001\u7238\u63a5\u53d7\u5230\u513f\u5b50\u53d1\u6765\u7684\u4fe1\u606f\r\n       a();\r\n    }).send(ctx); \/\/\u628actx\u4f20\u7ed9\u513f\u5b50\r\n  });\r\n\r\n  await ctx.render('index', Object.assign({\r\n    title:'55'\r\n  },pubObj));\r\n});<\/pre>\n<pre>\/\/child.js \u513f\u5b50 \uff08\u5b50\u8fdb\u7a0b\uff09\r\n;(async function () {\r\n  process.on('message', function(ctx) {\r\n    ctx.xxx=123; \/\/ ctx \u662f\u8001\u7238\u4f20\u6765\u7684\u6570\u636e\uff0c\u4e5f\u53ef\u4ee5\u81ea\u5df1\u6dfb\u52a0\u989d\u5916\u6570\u636e\u4f20\u56de\u53bb\r\n    process.send({ Hello: '\u8001\u7238\u6211\u662f\u513f\u5b50' }); \/\/\u5411\u8001\u7238\u53d1\u9001\u4fe1\u606f\r\n    process.exit(0); \/\/\u513f\u5b50\u53d1\u6570\u636e\u7ed9\u8001\u7238\u540e\uff0c\u4efb\u52a1\u5b8c\u6210\u9000\u51fa\u3002\r\n  });\r\n})();<\/pre>\n<p>\u63a8\u8350\u770b\u770b\u00a0 <a href=\"https:\/\/sdeno.com\/?p=5801\" target=\"_blank\" rel=\"noopener\">www.xgllseo.com\/?p=5801<\/a><\/p>\n<p><span style=\"color: #ff0000;\">\u6570\u636e\u7f13\u5b58<\/span><\/p>\n<pre>npm install node-cache --save<\/pre>\n<p>\u51c6\u5907\uff1a<\/p>\n<p>\u52a0\u8f7d\u5e76\u5b9e\u4f8b\u5316<\/p>\n<pre>const NodeCache = require( \"node-cache\" );\r\nconst myCache = new NodeCache(); \/\/\u53c2\u6570\u9ed8\u8ba4\r\nconst myCache = new NodeCache( { stdTTL: 0, checkperiod: 600 } ); \r\n\r\n\/\/\u5355\u503c\r\nmyCache.set( \"myKey\", \"aa\");\/\/\u8bbe\u7f6e\r\nmyCache.get( \"myKey\" ) \/\/\u53d6\u503c\r\nmyCache.has(\"myKey\") \/\/\u5224\u65ad\u503c\u662f\u5426\u5b58\u5728true\u5b58\u5728\uff0cfalse\u4e0d\u5b58\u5728\r\nmyCache.del( \"myKey\" ) \/\/\u5220\u9664\r\nvalue = myCache.take( \"myKey\" )  \/\/\u8d4b\u503c\u7ed9value\u53d8\u91cf\u5e76\u5220\u9664\"myKey\"\r\n\r\n\/\/\u591a\u503c\r\nmyCache.mset([\r\n    {key: \"myKey\", val: obj, ttl: 10000},\r\n    {key: \"myKey2\", val: obj2},\r\n])\r\nmyCache.mget( [ \"myKeyA\", \"myKeyB\" ] );\r\nmyCache.del( [ \"B\", \"C\" ] )\r\n\r\nmyCache.keys(); \/\/\u83b7\u53d6\u5f53\u524d\u6240\u6709\u53d8\u91cf\u540d [ \"all\", \"my\", \"keys\", \"foo\", \"bar\" ]\r\n\r\n\/\/\u56de\u8c03\r\nmyCache.on( \"set\", function( key, value ){\r\n    \/\/ ... do something ...\r\n});\r\n\r\nmyCache.on( \"del\", function( key, value ){\r\n    \/\/ \u624b\u52a8\u5220\u9664\uff0c\u6216\u8005\u503c\u8fc7\u671f\r\n});\r\n\r\nmyCache.on( \"expired\", function( key, value ){\r\n    \/\/\u503c\u8fc7\u671f\r\n});<\/pre>\n<p><a href=\"https:\/\/www.npmjs.com\/package\/node-cache\" target=\"_blank\" rel=\"noopener\">https:\/\/www.npmjs.com\/package\/node-cache<\/a><\/p>\n<p><span style=\"color: #ff0000;\">\u4ee3\u7406<\/span><\/p>\n<p>\u8bf7\u6c42\u7b2c\u4e09\u65b9\u63a5\u53e3\uff0c\u628a\u6570\u636e\u6e32\u67d3\u5230\u524d\u7aef<\/p>\n<p>\u5b89\u88c5\u6240\u9700\u6a21\u5757\uff1a<\/p>\n<pre>npm i request -S  \/\/\u7528\u6765\u8bf7\u6c42\u63a5\u53e3\u7c7b\u4f3cajax\r\nnpm install --save-dev koa2-proxy-middleware  \/\/\u8bbe\u7f6e\u4ee3\u7406<\/pre>\n<p>\u7f16\u8f91app.js<\/p>\n<pre>const proxy = require('koa2-proxy-middleware'); \/\/\u52a0\u8f7d\r\nconst bodyparser = require('koa-bodyparser')\r\n.\r\n.\r\n.<\/pre>\n<pre>\/\/\u53c2\u6570\u8bbe\u7f6e\r\nconst options = {\r\n  targets: {\r\n    '\/api\/(.*)': {\r\n      target: 'http:\/\/testh3.xxx.com\/',\r\n      changeOrigin: true,\r\n      pathRewrite: {\r\n        '^\/api': ''\r\n      }\r\n    },\r\n  }\r\n}\r\n\r\napp.use(proxy(options)); \/\/\u6ce8\u518c\u5230koa\u4e2d\r\n\r\n\r\n\/\/ bodyparser\u4e00\u5b9a\u8981\u653e\u5728\u4ee3\u7406\u540e\u9762\u4e0d\u7136\u4f1a\u6709\u95ee\u9898\r\napp.use(bodyparser({  \/\/\u89e3\u6790post\u6570\u636e\r\n  enableTypes:['json', 'form', 'text']\r\n}))<\/pre>\n<p>\u8def\u7531\u6848\u4f8b\uff1a<\/p>\n<pre>const router = require('koa-router')()\r\nconst request = require('request');\r\n\r\n\/\/\u6ce8\u610f\/api\/\u5c31\u76f8\u5f53\u4e8e\u524d\u7f00\uff0c\u5176\u5b9e\u771f\u662f\u7684\u63a5\u53e3\u6ca1\u6709\uff0c\u672c\u5730\u4ee3\u7406\u9700\u8981\u52a0\u4e0a\u800c\u5df2\r\nrequest.post('http:\/\/localhost:3000\/api\/wucg\/cms\/provinceCity\/list', function optionalCallback(err, httpResponse, body) {\r\n\r\n    router.get('\/', async (ctx, next) =&gt; {\r\n        await ctx.render('index', {\r\n            title: body\r\n        })\r\n    })\r\n\r\n})<\/pre>\n<p>&#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211;<br \/>\n\u7eafkoa2\u6a21\u5757\u4ecb\u7ecd<br \/>\n&#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211;<br \/>\n\u4ee5\u4e0a\u7684\u6559\u7a0b\u662f\u57fa\u4e8ekoa-generator\u811a\u624b\u67b6\u8fdb\u884c\u5f00\u53d1\uff0c\u5b89\u88c5\u7684\u540c\u65f6\u4e5f\u5927\u91cf\u5b89\u88c5\u4e86\u4e00\u4e9b\u9644\u5c5e\u4f9d\u8d56\u6a21\u5757\u8ba9\u5f00\u53d1\u7684\u66f4\u7b80\u5355\u3002koa-generator\u5176\u5b9e\u4e5f\u5c31\u662f\u4ee5koa2\u4e3a\u57fa\u7840\uff0c\u4f9d\u8d56\u5927\u91cf\u7684\u6a21\u5757\u8fdb\u884c\u7ec4\u88c5\uff0c\u5982\u679c\u5355\u7eaf\u7684\u4f7f\u7528koa2\u6765\u8fdb\u884c\u4e00\u6b65\u6b65\u5f00\u53d1\u53c8\u662f\u5982\u4f55\u7684\u5462\uff1f<\/p>\n<p>\u9996\u5148\u5b89\u88c5<\/p>\n<pre>npm install koa@next   \/\/\u4fdd\u8bc1\u5b89\u88c5koa\u662f2.x\u7248\u672c<\/pre>\n<p>&#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211;<\/p>\n<p>\u642d\u5efahttp<\/p>\n<pre>\/\/1.js\r\nconst Koa = require('koa');\r\nconst app = new Koa();\r\n\r\napp.listen(3000);<\/pre>\n<p>\u6267\u884cnode 1.js<\/p>\n<p>\u6253\u5f00http:\/\/localhost:3000\/ \uff0c\u4f1a\u770b\u5230&#8221;Not Found&#8221;,\u90a3\u662f\u56e0\u4e3a\u6ca1\u6709\u50cf\u5ba2\u6237\u7aef\u53d1\u9001\u4efb\u4f55\u6570\u636e\u3002<\/p>\n<p>&#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211;<\/p>\n<p>\u5411\u5ba2\u6237\u7aef\u53d1\u9001\u6570\u636e<\/p>\n<pre>const Koa = require('koa');\r\nconst app = new Koa();\r\n\r\napp.use((ctx)=&gt;{\r\n    ctx.response.body = '\u4f60\u597d';\r\n});\r\n\r\napp.listen(3000);<\/pre>\n<p>\u6253\u5f00\u9875\u9762 http:\/\/localhost:3000\/ \uff0c\u53ef\u4ee5\u770b\u5230\u663e\u793a\u5185\u5bb9\u201c\u4f60\u597d\u201d\uff0c\u5982\u679c\u6ca1\u6709\u6307\u5b9a\u53d1\u9001\u7ed9\u5ba2\u6237\u7aef\u7684\u6570\u636e\u7c7b\u578b\u9ed8\u8ba4\u662f\uff1atext\/plain<\/p>\n<figure class=\"mdx-lazyload-container\" style=\"max-width:299px\"><div style=\"padding-top:30.100334448161%\"><\/div><div class=\"mdx-img-loading-sp mdui-valign\"><div><div class=\"mdui-spinner\"><\/div><\/div><\/div><img width=\"299\" height=\"90\" class=\"alignnone size-full wp-image-6059 lazyload\" title=\"koa2\u7b14\u8bb0 koa-generator\u811a\u624b\u67b6\" src=\"data:image\/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\" data-src=\"https:\/\/sdeno.com\/wp-content\/uploads\/2017\/01\/WX20171025-1114081.png\" alt=\"https:\/\/sdeno.com\/wp-content\/uploads\/2017\/01\/WX20171025-1114081.png\"><\/figure>\n<p>&#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211;<\/p>\n<p>\u6307\u5b9a\u53d1\u9001\u5ba2\u6237\u7aef\u7684\u6570\u636e\u7c7b\u578b<\/p>\n<pre>const Koa = require('koa');\r\nconst app = new Koa();\r\n\r\napp.use((ctx)=&gt;{\r\n    ctx.response.type = 'html';\r\n    ctx.response.body = '&lt;html&gt;&lt;head&gt;&lt;title&gt;\u4f60\u597d&lt;\/title&gt;&lt;\/head&gt;&lt;body&gt;&lt;p&gt;\u8fd9\u91cc&lt;\/p&gt;&lt;\/body&gt;&lt;\/html&gt;';\r\n});\r\n\r\napp.listen(3000);<\/pre>\n<p>\u5176\u4ed6\u5e38\u89c1\u7c7b\u578b\u6709\uff1axml\u3001json\u3001text<\/p>\n<p>&#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211;<\/p>\n<p>koa2\u539f\u751f\u8def\u7531<\/p>\n<pre>app.use((ctx)=&gt;{\r\n    if(ctx.request.path == '\/'){  \/\/\u9996\u9875\r\n        ctx.response.type = 'html';\r\n        ctx.response.body = '&lt;html&gt;&lt;head&gt;&lt;title&gt;\u4f60\u597d&lt;\/title&gt;&lt;\/head&gt;&lt;body&gt;&lt;p&gt;\u9996\u9875&lt;\/p&gt;&lt;\/body&gt;&lt;\/html&gt;';\r\n    }\r\n    if(ctx.request.path == '\/about'){   \/\/ http:\/\/localhost:3000\/about\r\n        ctx.response.type = 'html';\r\n        ctx.response.body = '&lt;html&gt;&lt;head&gt;&lt;title&gt;\u4f60\u597d&lt;\/title&gt;&lt;\/head&gt;&lt;body&gt;&lt;p&gt;\u5173\u4e8e\u6211\u4eec&lt;\/p&gt;&lt;\/body&gt;&lt;\/html&gt;';\r\n    }\r\n});<\/pre>\n<p>&#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211;<\/p>\n<p><span style=\"color: #ff0000;\">\u9759\u6001\u8d44\u6e90<\/span><\/p>\n<pre>\/\/\u5728\u4e8c\u7ea7\u76ee\u5f55public\u91cc\u9762\u5b58\u653e\u7740css.css\r\nconst Koa = require('koa');\r\nconst app = new Koa();\r\n\r\n\r\napp.use(require('koa-static')(__dirname + '\/public'));\r\napp.listen(3000);<\/pre>\n<p>html:<\/p>\n<pre>\u76ee\u5f55\uff1apublic\\js\\jquery.min.js\r\n\r\n&lt;script src=\"\/js\/jquery.min.js\"&gt;&lt;\/script&gt;  \/\/\u5f15\u5165<\/pre>\n<p>\u8bbf\u95eehttp:\/\/127.0.0.1:3000\/css.css \uff0c\u53ef\u4ee5\u76f4\u63a5\u8bbf\u95ee\u5230\u5185\u5bb9<\/p>\n<p>&#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211;<\/p>\n<p><span style=\"color: #ff0000;\">\u4e3a\u9759\u6001\u8d44\u6e90\u52a0\u7248\u672c\u53f7<\/span><\/p>\n<pre>&lt;script src=\"&lt;%- '\/js\/jquery.min.js?='+ver %&gt;\"&gt;&lt;\/script&gt;<\/pre>\n<pre>var pubObj={ver:'22.2'};  \/\/\u516c\u5171\u5bf9\u8c61\uff0c\u63a8\u8350\u653e\u5728app.js\u4e2d\r\n\r\nrouter.get('\/',async (ctx, next) =&gt; {\r\n  await ctx.render('index', Object.assign({\r\n     title:'\u9996\u9875'\r\n  },pubObj));\r\n});<\/pre>\n<p>\u63a8\u8350\u4f7f\u7528gulp\u3001webpack\u7c7b\u4f3c\u5de5\u5177\u6dfb\u52a0\u7248\u672c\u53f7<\/p>\n<p>&#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211;<\/p>\n<p>302\u81ea\u52a8\u8df3\u8f6c\u3001\u91cd\u5b9a\u5411<\/p>\n<pre>const Koa = require('koa');\r\nconst app = new Koa();\r\n\r\n\r\napp.use((ctx)=&gt;{\r\n    if(ctx.request.path == '\/'){\r\n        ctx.response.redirect('\/about')  \/\/\u8bbf\u95ee\u9996\u9875\u65f6\uff0c\u4f1a\u81ea\u52a8\u8df3\u8f6c\u5230\/about\u9875\u9762\r\n        ctx.response.type = 'html';\r\n        ctx.response.body = '&lt;html&gt;&lt;head&gt;&lt;title&gt;\u4f60\u597d&lt;\/title&gt;&lt;\/head&gt;&lt;body&gt;&lt;p&gt;\u9996\u9875&lt;\/p&gt;&lt;\/body&gt;&lt;\/html&gt;';\r\n    }\r\n    if(ctx.request.path == '\/about'){\r\n        ctx.response.type = 'html';\r\n        ctx.response.body = '&lt;html&gt;&lt;head&gt;&lt;title&gt;\u4f60\u597d&lt;\/title&gt;&lt;\/head&gt;&lt;body&gt;&lt;p&gt;\u5173\u4e8e\u6211\u4eec&lt;\/p&gt;&lt;form method=\"get\" action=\"\/ser\"&gt;&lt;input type=\"text\" name=\"xxx1\"&gt;&lt;input type=\"submit\" value=\"\u63d0\u4ea4\"&gt;&lt;\/form&gt;&lt;\/body&gt;&lt;\/html&gt;';\r\n    }\r\n\r\n});\r\n\r\napp.listen(3000);<\/pre>\n<p>&#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211;<\/p>\n<p>\u4e2d\u95f4\u4ef6\uff0c\u5728\u5ba2\u6237\u7aef\u4e2d\u5c06\u6570\u636e\u4f20\u9012\u7ed9\u540e\u53f0\u63a5\u6536\u65f6\uff0c\u7684\u4e2d\u95f4\u8fc7\u7a0b\u90fd\u4f1a\u7ecf\u5386\u4e00\u5c42\u5c42\u7684\u4e2d\u95f4\u5904\u7406\u540e\u624d\u80fd\u5c06\u6570\u636e\u4f20\u9012\u5230\u540e\u53f0\u3002<\/p>\n<p>app.use() \/\/\u5c31\u662f\u4e13\u95e8\u52a0\u8f7d\u4e2d\u95f4\u4ef6\u7684\uff0cnew require(&#8216;koa&#8217;)().use<\/p>\n<pre>const Koa = require('koa');\r\nconst app = new Koa();\r\n\r\n\/\/ \u4ee5\u4e0b\u6267\u884c\u987a\u5e8f\u662f\u540c\u6b65\u6267\u884c\r\nconst one = (ctx, next) =&gt; {\r\n    console.log('&gt;&gt; one');\r\n    next();\r\n    console.log('&lt;&lt; one');\r\n}\r\n\r\nconst two = (ctx, next) =&gt; {\r\n    console.log('&gt;&gt; two');\r\n    next();\r\n    console.log('&lt;&lt; two');\r\n}\r\n\r\nconst three = (ctx, next) =&gt; {\r\n    console.log('&gt;&gt; three');\r\n    next();\r\n    console.log('&lt;&lt; three');\r\n}\r\n\r\napp.use(one);\r\napp.use(two);\r\napp.use(three);\r\n\r\napp.listen(3000);\r\n-----------------\r\n\u7ed3\u679c\uff1a\r\n&gt;&gt; one\r\n&gt;&gt; two\r\n&gt;&gt; three\r\n&lt;&lt; three\r\n&lt;&lt; two\r\n&lt;&lt; one\r\n\r\n<\/pre>\n<pre>const Koa = require('koa');\r\nconst app = new Koa();\r\n\r\n\r\nconst one = (ctx, next) =&gt; {\r\n console.log('&gt;&gt; one');\r\n next();\r\n console.log('&lt;&lt; one');\r\n}\r\n\r\nconst two = (ctx, next) =&gt; {\r\n console.log('&gt;&gt; two');\r\n                        \/\/next()  \u5220\u9664\r\n console.log('&lt;&lt; two');\r\n}\r\n\r\nconst three = (ctx, next) =&gt; {\r\n console.log('&gt;&gt; three');\r\n next();\r\n console.log('&lt;&lt; three');\r\n}\r\n\r\napp.use(one);\r\napp.use(two);\r\napp.use(three);\r\n\r\napp.listen(3000);\r\n-----------------\r\n\u7ed3\u679c\uff1a\r\n&gt;&gt; one\r\n&gt;&gt; two\r\n&lt;&lt; two\r\n&lt;&lt; one\r\n<\/pre>\n<p>\u6240\u4ee5\u8bf4\uff0c\u8981\u4fdd\u8bc1\u6240\u6709\u7684\u4e2d\u95f4\u4ef6\u80fd\u8fd0\u884c\u7684\u5230\uff0c\u5c31\u8981\u4f7f\u7528next()\u8fdb\u884c\u4e32\u8054<\/p>\n<p>\u4e2d\u95f4\u4ef6\uff0c\u5f02\u6b65\u6267\u884c<\/p>\n<pre>const one =async (ctx, next) =&gt; {\r\n   await console.log('&gt;&gt; one1');\r\n    next();\r\n    await console.log('&lt;&lt; one2');\r\n}\r\n\r\nconst two =async (ctx, next) =&gt; {\r\n    await console.log('&gt;&gt; two3');\r\n    next();\r\n    await console.log('&lt;&lt; two4');\r\n}\r\n\r\nconst three =async (ctx, next) =&gt; {\r\n    await console.log('&gt;&gt; three5');\r\n    next();\r\n    await console.log('&lt;&lt; three6');\r\n}<\/pre>\n<p>\u6267\u884c\u7ed3\u679c\u5b8c\u5168\u6253\u4e71<\/p>\n<p>&#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211;<\/p>\n<p>\u5408\u5e76\u4e2d\u95f4\u4ef6\uff0c\u5982\u679c\u89c9\u5f97app.use()\u4f7f\u7528\u7684\u9891\u7387\u8fc7\u9ad8\uff0c\u53ef\u4ee5\u4f7f\u7528koa-compose<\/p>\n<pre>npm install koa-compose<\/pre>\n<p>\u6848\u4f8b\uff1a<\/p>\n<pre>const middlewares = compose([one, two,three]);\r\napp.use(middlewares);<\/pre>\n<p>&#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211;<\/p>\n<p>500 \u9519\u8bef<\/p>\n<pre>const main = ctx =&gt; {\r\n ctx.throw(500);\r\n};<\/pre>\n<p>404\u9519\u8bef<\/p>\n<pre>const main = ctx =&gt; {\r\n ctx.response.status = 404;   \/\/\u5c31\u76f8\u5f53\u4e8ectx.throw(404)\r\n ctx.response.body = 'Page Not Found';\r\n};<\/pre>\n<p>&#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211;<\/p>\n<p>\u9519\u8bef\u7684\u7edf\u4e00\u5904\u7406<\/p>\n<p>\u4e3a\u4e86\u65b9\u4fbf\u5904\u7406\u9519\u8bef\uff0c\u6700\u597d\u4f7f\u7528try&#8230;catch\u5c06\u5176\u6355\u83b7\u3002\u4f46\u662f\uff0c\u4e3a\u6bcf\u4e2a\u4e2d\u95f4\u4ef6\u90fd\u5199try&#8230;catch\u592a\u9ebb\u70e6\uff0c\u6211\u4eec\u53ef\u4ee5\u8ba9\u6700\u5916\u5c42\u7684\u4e2d\u95f4\u4ef6\uff0c\u8d1f\u8d23\u6240\u6709\u4e2d\u95f4\u4ef6\u7684\u9519\u8bef\u5904\u7406\u3002<\/p>\n<pre>const handler = async (ctx, next) =&gt; {\r\n  try {\r\n    await next();\r\n  } catch (err) {  \/\/\u62a5\u9519\u6267\u884c\u6b64\u5904\r\n    ctx.response.status = err.statusCode || err.status || 500;\r\n    ctx.response.body = {\r\n      message: err.message\r\n    };\r\n  }\r\n};\r\n\r\nconst main = ctx =&gt; {\r\n  ctx.throw(500);\r\n};\r\n\r\napp.use(handler);\r\napp.use(main);\r\n<\/pre>\n<p>\u7c7b\u4f3c\u6548\u679c\uff0c\u5bf9\u9519\u8bef\u540e\u7684\u5904\u7406<\/p>\n<pre>const main = ctx =&gt; {\r\n ctx.throw(500);\r\n};\r\n\r\napp.on('error', (err, ctx) =&gt;\r\n console.error('server error', err);\r\n);<\/pre>\n<p>\u6ce8\u610f\uff1a\u540c\u65f6\u4f7f\u7528try&#8230;catch \u548c app.on(&#8216;error&#8217;,fn)\uff0c\u76d1\u542cerror\u4e8b\u4ef6\u4e0d\u4f1a\u88ab\u89e6\u53d1\uff0c\u9664\u975e\u91ca\u653e\u9519\u8bef\u4e8b\u4ef6\uff0c\u4f8b\u5982\uff1a<\/p>\n<pre>const handler = async (ctx, next) =&gt; {\r\n try {\r\n   await next();\r\n } catch (err) {\r\n   ctx.response.status = err.statusCode || err.status || 500;\r\n   ctx.response.type = 'html';\r\n   ctx.response.body = '&lt;p&gt;Something wrong, please contact administrator.&lt;\/p&gt;';\r\n   ctx.app.emit('error', err, ctx);  \/\/\u91ca\u653e\u9519\u8befapp.on('error',fn)\u624d\u80fd\u88ab\u6267\u884c\r\n }\r\n};\r\n\r\nconst main = ctx =&gt; {\r\n   ctx.throw(500);\r\n};\r\n\r\napp.on('error', function(err) {\r\n   console.log('logging error ', err.message);\r\n   console.log(err);\r\n});<\/pre>\n<p>&#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211; &#8211;<\/p>\n<p>cookies<\/p>\n<pre>const main = function(ctx) {\r\n ctx.cookies.set('view', '187'); \/\/\u8bbe\u7f6e\r\n ctx.response.body = ctx.cookies.get('view'); \/\/\u53d6\u503c\r\n}<\/pre>\n<p><audio style=\"display: none;\" controls=\"controls\"><\/audio><\/p>\n<p><audio style=\"display: none;\" controls=\"controls\"><\/audio><\/p>\n<p><audio style=\"display: none;\" controls=\"controls\"><\/audio><\/p>\n<p><audio style=\"display: none;\" controls=\"controls\"><\/audio><\/p>\n<p><audio style=\"display: none;\" controls=\"controls\"><\/audio><\/p>\n<p><audio style=\"display: none;\" controls=\"controls\"><\/audio><\/p>\n<p><audio style=\"display: none;\" controls=\"controls\"><\/audio><\/p>\n<p><audio style=\"display: none;\" controls=\"controls\"><\/audio><\/p>\n<p><audio style=\"display: none;\" controls=\"controls\"><\/audio><\/p>\n<p><audio style=\"display: none;\" controls=\"controls\"><\/audio><\/p>\n<p><audio style=\"display: none;\" controls=\"controls\"><\/audio><\/p>\n<p><audio style=\"display: none;\" controls=\"controls\"><\/audio><\/p>\n<p><audio style=\"display: none;\" controls=\"controls\"><\/audio><\/p>\n<p><audio style=\"display: none;\" controls=\"controls\"><\/audio><\/p>\n<p><audio style=\"display: none;\" controls=\"controls\"><\/audio><\/p>\n<p><audio style=\"display: none;\" controls=\"controls\"><\/audio><\/p>\n<p><audio style=\"display: none;\" controls=\"controls\"><\/audio><\/p>\n<p><audio style=\"display: none;\" controls=\"controls\"><\/audio><\/p>\n<p><audio style=\"display: none;\" controls=\"controls\"><\/audio><\/p>\n<p><audio style=\"display: none;\" controls=\"controls\"><\/audio><\/p>\n<p><audio style=\"display: none;\" controls=\"controls\"><\/audio><\/p>\n<p><audio style=\"display: none;\" controls=\"controls\"><\/audio><\/p>\n<p><audio style=\"display: none;\" controls=\"controls\"><\/audio><\/p>\n<p><audio style=\"display: none;\" controls=\"controls\"><\/audio><\/p>\n<p><audio style=\"display: none;\" controls=\"controls\"><\/audio><\/p>\n<p><audio style=\"display: none;\" controls=\"controls\"><\/audio><\/p>\n<p><audio style=\"display: none;\" controls=\"controls\"><\/audio><\/p>\n<p><audio style=\"display: none;\" controls=\"controls\"><\/audio><\/p>\n<p><audio style=\"display: none;\" controls=\"controls\"><\/audio><\/p>\n<p><audio style=\"display: none;\" controls=\"controls\"><\/audio><\/p>\n<p><audio style=\"display: none;\" controls=\"controls\"><\/audio><\/p>\n<p><audio style=\"display: none;\" controls=\"controls\"><\/audio><\/p>\n<p><audio style=\"display: none;\" controls=\"controls\"><\/audio><\/p>\n<p><audio style=\"display: none;\" controls=\"controls\"><\/audio><\/p>\n<p><audio style=\"display: none;\" controls=\"controls\"><\/audio><\/p>\n<p><audio style=\"display: none;\" controls=\"controls\"><\/audio><\/p>\n<p><audio style=\"display: none;\" controls=\"controls\"><\/audio><\/p>\n<p><audio style=\"display: none;\" controls=\"controls\"><\/audio><\/p>\n<p><audio style=\"display: none;\" controls=\"controls\"><\/audio><\/p>\n<p><audio style=\"display: none;\" controls=\"controls\"><\/audio><\/p>\n<p><audio style=\"display: none;\" controls=\"controls\"><\/audio><\/p>\n<p><audio style=\"display: none;\" controls=\"controls\"><\/audio><\/p>\n<p><audio style=\"display: none;\" controls=\"controls\"><\/audio><\/p>\n<p><audio style=\"display: none;\" controls=\"controls\"><\/audio><\/p>\n","protected":false},"excerpt":{"rendered":"<p>koa\u7b14\u8bb0 koa2 \u7b14\u8bb0 \u4e4b\u524d\u4e00\u76f4\u4f7f\u7528express\u89c9\u5f97\u8fd8\u53ef\u4ee5\uff0c\u4e0d\u4e45express\u56e2\u961f\u53c8\u51fa\u4e86\u4e00\u4e2akoa,\u4e5f\u51fa [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[44],"tags":[],"class_list":["post-5633","post","type-post","status-publish","format-standard","hentry","category-koa"],"_links":{"self":[{"href":"https:\/\/sdeno.com\/index.php?rest_route=\/wp\/v2\/posts\/5633","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/sdeno.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sdeno.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sdeno.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/sdeno.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=5633"}],"version-history":[{"count":0,"href":"https:\/\/sdeno.com\/index.php?rest_route=\/wp\/v2\/posts\/5633\/revisions"}],"wp:attachment":[{"href":"https:\/\/sdeno.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=5633"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sdeno.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=5633"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sdeno.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=5633"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}