{"id":6109,"date":"2017-11-10T11:59:23","date_gmt":"2017-11-10T03:59:23","guid":{"rendered":"https:\/\/sdeno.com\/?p=6109"},"modified":"2017-11-10T14:15:50","modified_gmt":"2017-11-10T06:15:50","slug":"hapi%e7%ac%94%e8%ae%b0%e6%95%99%e7%a8%8b","status":"publish","type":"post","link":"https:\/\/sdeno.com\/?p=6109","title":{"rendered":"hapi\u7b14\u8bb0\/\u6559\u7a0b"},"content":{"rendered":"<p>\u672c\u6559\u7a0b\u57fa\u4e8ehapi@13.5.3<\/p>\n<pre>\"dependencies\": {\r\n\"boom\": \"^3.2.2\",\r\n\"ejs\": \"^2.5.7\",\r\n\"good\": \"^6.6.3\",\r\n\"good-console\": \"^5.3.2\",\r\n\"hapi\": \"^13.5.3\",\r\n\"hapi-auth-cookie\": \"^6.1.1\",\r\n\"hapi-mobile-detect\": \"^1.3.5\",\r\n\"inert\": \"^4.2.1\",\r\n\"joi\": \"^8.4.2\",\r\n\"netmask\": \"^1.0.5\",\r\n\"vision\": \"^4.1.1\"\r\n}\r\n<\/pre>\n<p><a href=\"https:\/\/sdeno.com\/wp-content\/uploads\/2017\/11\/hapi.txt\">hapi<\/a><\/p>\n<p>\u57fa\u7840\u5305\uff1a<a href=\"https:\/\/sdeno.com\/wp-content\/uploads\/2017\/11\/hapi_www.zip\">hapi_www<\/a><\/p>\n<p>&nbsp;<\/p>\n<p>\u6559\u7a0b\u57fa\u4e8enpm install &#8211;save hapi@13.5.3<\/p>\n<p>1,\u642d\u5efahttp<\/p>\n<p>var Hapi = require(&#8216;hapi&#8217;);<br \/>\nvar server=new Hapi.Server();<br \/>\nserver.connection({port:4000});<br \/>\nserver.route([{<br \/>\nmethod:&#8217;GET&#8217;,<br \/>\npath:&#8217;\/&#8217;,<br \/>\nhandler:function (request,reply) {<br \/>\nreply({name:&#8217;234&#8242;});<br \/>\n}<br \/>\n}]);<\/p>\n<p>&nbsp;<\/p>\n<p>server.start((err)=&gt;{<br \/>\nconsole.log(&#8216;\u6b63\u5e38&#8217;);<br \/>\n});<\/p>\n<p>&nbsp;<\/p>\n<p>\u8bbf\u95ee\uff1ahttp:\/\/127.0.0.1:4000\/<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>2\uff0c\u5728shell\u7a97\u53e3\u547d\u4ee4\u91cc\u9762\uff0c\u5b9e\u65f6\u76d1\u542chttp\u8bbf\u95ee\u8bb0\u5f55\u65e5\u5fd7<\/p>\n<p>&nbsp;<\/p>\n<p>var Hapi = require(&#8216;hapi&#8217;);<br \/>\nvar server=new Hapi.Server();<br \/>\nserver.connection({port:4000});<br \/>\nserver.route([{<br \/>\nmethod:&#8217;GET&#8217;,<br \/>\npath:&#8217;\/&#8217;,<br \/>\nhandler:function (request,reply) {<br \/>\nreply({name:&#8217;234&#8242;});<br \/>\n}<br \/>\n}]);<\/p>\n<p>&nbsp;<\/p>\n<p>\/\/\u9700\u8981\u5b89\u88c5 npm install &#8211;save good@6 good-console@5<br \/>\nserver.register([{<br \/>\nregister:require(&#8216;good&#8217;),<br \/>\noptions:{<br \/>\nreporters:[{<br \/>\nreporter:require(&#8216;good-console&#8217;),<br \/>\nevents:{response:&#8217;*&#8217;}<br \/>\n}]<br \/>\n}<br \/>\n}],(err)=&gt;{<br \/>\nserver.start((err)=&gt;{<br \/>\nconsole.log(&#8216;\u6b63\u5e38&#8217;);<br \/>\n});<br \/>\n});<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>3\uff0c\u8def\u7531\u5206\u79bb\uff0c(\u628a\u4e00\u4e9b\u8def\u7531\u72ec\u7acb\u51fa\u6765)<\/p>\n<p>&nbsp;<\/p>\n<p>\/\/route.js<\/p>\n<p>module.exports=[{<br \/>\nmethod:&#8217;GET&#8217;,<br \/>\npath:&#8217;\/haha&#8217;,<br \/>\nhandler:function (request,reply) {<br \/>\nreply(&#8216;\u4f60\u597d\u54c8\u54c8&#8217;);<br \/>\n\/\/this.db \u8fd9\u6837\u53ef\u4ee5\u627e\u5230\u6570\u636e\u5e93<br \/>\n}<br \/>\n}];<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>\/\/index.js<\/p>\n<p>var Hapi = require(&#8216;hapi&#8217;);<\/p>\n<p>var Sqlite3=require(&#8216;sqlite3&#8217;);<br \/>\nvar db1=new Sqlite3.Database(&#8216;.\/db&#8217;)<\/p>\n<p>var server=new Hapi.Server();<br \/>\nserver.connection({port:4000});<br \/>\nserver.route([{<br \/>\nmethod:&#8217;GET&#8217;,<br \/>\npath:&#8217;\/&#8217;,<br \/>\nhandler:function (request,reply) {<br \/>\nreply({name:&#8217;234&#8242;});<br \/>\n}<br \/>\n}]);<\/p>\n<p>&nbsp;<\/p>\n<p>server.bind({db:db1}); \/\/\u80fd\u4fdd\u8bc1\u5f15\u5165\u7684\u5916\u6765\u8def\u7531\u53ef\u4ee5\u5728handler\u91cc\u9762\u7684this.db\u627e\u5230\u6570\u636e\u5e93<\/p>\n<p>\/\/\u8c03\u7528\uff1a<br \/>\nserver.route(require(&#8216;.\/route&#8217;));<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>4\uff0c\u4f20\u53c2\u3002\u5c06\u7236\u9875\u9762\u7684\u53c2\u6570\uff0c\u4f20\u5165\u7ed9\u5f15\u5165\u7684\u5b50\u6a21\u5757\u4e2d<\/p>\n<p>server.bind({db:&#8217;\u6570\u636e&#8217;});<br \/>\nserver.route(require(&#8216;.\/route&#8217;)); \/\/\u5728route.js\u4e2d\u7684handler\u91cc\u9762\u53ef\u4ee5\u4f7f\u7528this.db\u6765\u5f97\u5230\u6570\u636e<\/p>\n<p>\/\/route.js<br \/>\nmodule.exports=[{<br \/>\nmethod:&#8217;GET&#8217;,<br \/>\npath:&#8217;\/&#8217;,<br \/>\nhandler:function (request,reply) {<br \/>\nthis.db \/\/\u6253\u5370\u51fa\uff1a\u6570\u636e<br \/>\n}<br \/>\n}];<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>5\uff0cejs\u6a21\u677f<br \/>\nnpm install ejs &#8211;save<\/p>\n<p>server.register([{<br \/>\nregister:require(&#8216;good&#8217;),<br \/>\noptions:{<br \/>\nreporters:[{<br \/>\nreporter:require(&#8216;good-console&#8217;),<br \/>\nevents:{response:&#8217;*&#8217;}<br \/>\n}]<br \/>\n}<br \/>\n},<br \/>\nrequire(&#8216;inert&#8217;),<br \/>\nrequire(&#8216;vision&#8217;), \/\/\u52a0\u8f7d\u6a21\u677f\uff0c\u53ef\u4ee5\u4f7f\u7528server.views()\u65b9\u6cd5<br \/>\n],(err)=&gt;{<\/p>\n<p>server.views({ \/\/\u914d\u7f6e\u6a21\u677f<br \/>\nengines:{<br \/>\nejs:require(&#8216;ejs&#8217;) \/\/npm install ejs &#8211;save<br \/>\n},<br \/>\nrelativeTo:__dirname,<br \/>\npath:&#8217;.\/views&#8217;,<br \/>\nisCached:false \/\/\u5efa\u8bae\u6b63\u5f0f\u4e0a\u7ebf\u6539\u4e3atrue<br \/>\n});<\/p>\n<p>server.route(require(&#8216;.\/route&#8217;));<br \/>\nserver.start((err)=&gt;{<br \/>\nconsole.log(&#8216;\u6b63\u5e38&#8217;);<br \/>\n});<\/p>\n<p>&nbsp;<\/p>\n<p>});<\/p>\n<p>&nbsp;<\/p>\n<p>\u5728views\u76ee\u5f55\u4e2d\u5b58\u653eindex.ejs<br \/>\n\u5185\u5bb9: &lt;%= title %&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>\u4f7f\u7528\uff1a<br \/>\nhandler:function (request,reply) {<br \/>\nreply.view(&#8216;index&#8217;,{<br \/>\ntitle:request.params.id<br \/>\n});<br \/>\n}<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>6\uff0c\u540e\u53f0\u63a5\u6536get\u3001post\u6570\u636e<\/p>\n<p>\u63a5\u6536get<br \/>\nmethod:&#8217;GET&#8217;,<br \/>\npath:&#8217;\/test\/{id}&#8217;,<br \/>\nhandler:function (request,reply) {<br \/>\nreply.view(&#8216;index&#8217;,{<br \/>\ntitle:request.params.id<br \/>\n});<br \/>\n}<\/p>\n<p>&nbsp;<\/p>\n<p>\u63a5\u6536post<br \/>\n&lt;form method=&#8221;post&#8221; action=&#8221;\/post_test&#8221;&gt;<br \/>\n&lt;input type=&#8221;text&#8221; name=&#8221;user&#8221;&gt;<br \/>\n&lt;input type=&#8221;submit&#8221; value=&#8221;\u63d0\u4ea4&#8221;&gt;<br \/>\n&lt;\/form&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>method:&#8217;POST&#8217;,<br \/>\npath:&#8217;\/post_test&#8217;,<br \/>\nconfig:{<br \/>\npayload:{<br \/>\noutput:&#8217;data&#8217;<br \/>\n}<br \/>\n},<br \/>\nhandler:function (request,reply) {<br \/>\nconsole.log(&#8216;post\u6570\u636e&#8217;+request.payload.user);<br \/>\n}<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>7, cookies<\/p>\n<p>npm install &#8211;save hapi-auth-cookie@6<\/p>\n<p>&nbsp;<\/p>\n<p>server.register([{<br \/>\nregister:require(&#8216;good&#8217;),<br \/>\noptions:{<br \/>\nreporters:[{<br \/>\nreporter:require(&#8216;good-console&#8217;),<br \/>\nevents:{response:&#8217;*&#8217;}<br \/>\n}]<br \/>\n}<br \/>\n},<br \/>\nrequire(&#8216;inert&#8217;),<br \/>\nrequire(&#8216;vision&#8217;),<br \/>\nrequire(&#8216;hapi-auth-cookie&#8217;), \/\/\u52a0\u8f7dcookies<br \/>\n],(err)=&gt;{<\/p>\n<p>if(err){<br \/>\nthrow err;<br \/>\n}<\/p>\n<p>\/\/\u8bbe\u7f6ecookies<br \/>\nserver.auth.strategy(&#8216;session&#8217;,&#8217;cookie&#8217;,&#8217;try&#8217;,{<br \/>\npassword:&#8217;password-that-is-at-least-32-chars&#8217;, \/\/\u52a0\u5bc6\u65b9\u5f0f<br \/>\nttl: 24 * 3600 * 1000, \/\/1\u5929\u540e\u8fc7\u671f,\u5982\u679c\u4e0d\u8bbe\u7f6e\u4e00\u65e6\u5173\u95ed\u9875\u9762cookies\u503c\u5c31\u6d88\u5931<br \/>\nisSecure:false, \/\/true\u65f6,\u53ea\u5141\u8bb8https\u4f7f\u7528<br \/>\n});<\/p>\n<p>&nbsp;<\/p>\n<p>});<\/p>\n<p>&nbsp;<\/p>\n<p>\u8bbe\u7f6e\uff1a<br \/>\nhandler:function (request,reply) {<br \/>\nrequest.cookieAuth.set({<br \/>\nname:encodeURIComponent(request.params.id)<br \/>\n});<\/p>\n<p>reply.view(&#8216;index&#8217;,{<br \/>\ntitle: request.params.id<br \/>\n});<br \/>\n}<\/p>\n<p>&nbsp;<\/p>\n<p>\u53d6\u503c\uff1a<br \/>\nrequest.auth.credentials.name<\/p>\n<p>&nbsp;<\/p>\n<p>\u6e05\u9664\uff1a<br \/>\nrequest.cookieAuth.clear();<\/p>\n<p>&nbsp;<\/p>\n<p>\u5224\u65ad\u662f\u5426\u5b58\u5728cookies\uff1a<br \/>\nrequest.auth.isAuthenticated \/\/\u8fd4\u56de\u5e03\u5c14\u503c<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>8,\u9875\u9762\u8df3\u8f6c<br \/>\nreply.redirect(&#8216;\/&#8217;);<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>9\uff0c\u8def\u7531\u8def\u5f84<\/p>\n<p>path:&#8217;\/images\/{id}&#8217;<br \/>\nhttp:\/\/127.0.0.1\/images\/sdf<\/p>\n<p>&nbsp;<\/p>\n<p>\/\/\u53ef\u9009\u53c2\u6570<br \/>\npath:&#8217;\/images\/{id?}&#8217;<br \/>\nhttp:\/\/127.0.0.1\/images\/sdf<br \/>\n\u6216\u8005<br \/>\nhttp:\/\/127.0.0.1\/images\/<\/p>\n<p>&nbsp;<\/p>\n<p>\/\/\u901a\u914d\u7b26<br \/>\npath:&#8217;\/{id*}&#8217;<br \/>\n\u8fd9\u4e2a\u8def\u5f84\u662f\u5168\u80fd\u578b\u5339\u914d\uff0c\u9759\u6001\u8d44\u6e90\u5c31\u662f\u9760\u901a\u914d\u7b26\u914d\u7f6e\u7684<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>10\uff0c\u670d\u52a1\u5668\u65b9\u6cd5<\/p>\n<p>\u7c7b\u4f3c \u628a\u591a\u4e2a\u8def\u7531\u91cc\u9762\u7684\u516c\u5171\u65b9\u6cd5\u62bd\u51fa\u6765\u72ec\u7acb\u6210\u4e00\u4e2a\u516c\u5171\u7684\u65b9\u6cd5\u3002<\/p>\n<p>\u521b\u5efa\uff1a<br \/>\nserver.method({<br \/>\nname:&#8217;mean123&#8242;,<br \/>\nmethod:function (values,next) {<br \/>\n\/\/ var sum=values.reduce((a,b)=&gt;{a+b});<br \/>\nreturn next(null,values);<br \/>\n},<br \/>\noptions:{}<br \/>\n});<\/p>\n<p>&nbsp;<\/p>\n<p>\u8c03\u7528\uff1a(\u8981\u5728\u8def\u7531\u91cc\u9762\u7684handler\u91cc\u9762\u8c03\u7528)<br \/>\nhandler:function (request,reply) {<br \/>\nserver.methods.mean123(JSON.parse(request.payload.user),(err,mean)=&gt;{<br \/>\nconsole.log(JSON.stringify(mean));<br \/>\nreturn reply.view(&#8216;index&#8217;,{<br \/>\ntitle:{mean:JSON.stringify(mean)}[&#8216;mean&#8217;]<br \/>\n});<br \/>\n});<br \/>\n}<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>11\uff0c\u540c\u6b65\uff08\u5148\u51b3\u6761\u4ef6\uff09<\/p>\n<p>server.route({<br \/>\nmethod:&#8217;post&#8217;,<br \/>\npath:&#8217;\/post_test&#8217;,<br \/>\nconfig:{<br \/>\npayload:{<br \/>\noutput:&#8217;data&#8217; \/\/\u9760request.payload.\u5c5e\u6027\u540d \u6765\u83b7\u53d6\u3002\u5982\u679c&lt;input name=&#8221;user&#8221;&gt;\u90a3\u4e48request.payload.user<br \/>\n},<br \/>\npre:[{<br \/>\nassign:&#8217;xx&#8217;, \/\/\u5728handler\u91cc\u9762\u9760request.pre.xx\u83b7\u53d6<br \/>\nmethod:function (request,reply) { \/\/\u8fd9\u91cc\u6bd4handler\u8981\u5148\u6267\u884c<br \/>\nsetTimeout(function () {<br \/>\nreply(&#8216;\u6570\u636e\u554a&#8217;); \/\/\u8981\u4f7f\u7528reply\u624d\u80fd\u5c06\u6570\u636e\u8fd4\u56de\u7ed9handler\u4e2d\u7684request.pre.xx<br \/>\n},5000);<\/p>\n<p>\/\/ reply(&#8216;\u8df3\u8fc7handler\u51fd\u6570,\u76f4\u63a5\u5c06\u6570\u636e\u663e\u793a\u5230\u6d4f\u89c8\u5668&#8217;).takeover();<\/p>\n<p>}<br \/>\n}]<br \/>\n},<br \/>\nhandler:function (request,reply) { \/\/\u4e00\u5b9a\u8981\u7b49pre\u7684method\u6267\u884c\u5b8c\u6bd5\u540e\uff0c\u624d\u8f6e\u5230handler\u6267\u884c<br \/>\nconsole.log(&#8216;user:&#8217;+request.payload.user); \/\/user\u662f&lt;input name=&#8221;user&#8221;&gt;<br \/>\nconsole.log(&#8216;xx:&#8217;+request.pre.xx);<br \/>\nreply.view(&#8216;index&#8217;,{<br \/>\ntitle:request.pre.xx<br \/>\n});<\/p>\n<p>}<br \/>\n});<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>12\uff0c\u5e26\u6709\u5148\u51b3\u6761\u4ef6\u7684\u670d\u52a1\u5668\u65b9\u6cd5 (\u7c7b\u4f3c\uff1a\u591a\u4e2a\u65b9\u6cd5\u540c\u6b65\u6392\u961f\u6267\u884c)<\/p>\n<p>&nbsp;<\/p>\n<p>\u58f0\u660e\u591a\u4e2a\u670d\u52a1\u5668\u65b9\u6cd5\uff1a<br \/>\nserver.method([{<br \/>\nname:&#8217;mean123&#8242;,<br \/>\nmethod:function (request,reply) {<br \/>\nsetTimeout(function () {<br \/>\nreply(&#8216;\u6570\u636e123&#8242;);<br \/>\n},5000);<\/p>\n<p>},<br \/>\noptions:{}<br \/>\n},<br \/>\n{<br \/>\nname:&#8217;mean456&#8217;,<br \/>\nmethod:function (request,reply) {<br \/>\nconsole.log(request.pre.mean123); \/\/\u53ef\u4ee5\u83b7\u53d6\u5230\u5148\u6267\u884c\u5b8c\u6bd5\u7684\u670d\u52a1\u5668\u65b9\u6cd5\u7684\u6570\u636e<br \/>\nreply(&#8216;\u6570\u636e456&#8242;);<br \/>\n},<br \/>\noptions:{}<br \/>\n}<br \/>\n]);<\/p>\n<p>&nbsp;<\/p>\n<p>\u8c03\u7528\uff1a<br \/>\nserver.route({<br \/>\nmethod:&#8217;post&#8217;,<br \/>\npath:&#8217;\/post_test&#8217;,<br \/>\nconfig:{<br \/>\npayload:{<br \/>\noutput:&#8217;data&#8217;<br \/>\n},<br \/>\npre:[&#8216;mean123&#8242;,&#8217;mean456&#8217;] \/\/\u540c\u6b65\uff0c\u8981\u7b49mean123\u7684\u670d\u52a1\u5668\u65b9\u6cd5\u6267\u884c\u5b8c\u6bd5\u540e\uff0c\u624d\u8f6e\u5230mean456\u6267\u884c<br \/>\n},<br \/>\nhandler:function (request,reply) {<br \/>\nreply.view(&#8216;index&#8217;,{<br \/>\ntitle:request.pre.mean123+&#8217;&#8211;&#8216;+request.pre.mean456<br \/>\n});<br \/>\n}<br \/>\n});<\/p>\n<p>&nbsp;<\/p>\n<p>\u5f02\u6b65\uff1a<br \/>\n\u4f8b\u5982\uff1a<br \/>\npre:[<br \/>\n[ \/\/\u8fd9\u4e24\u4e2a\u670d\u52a1\u5668\u65b9\u6cd5\uff0c\u5c5e\u4e8e\u5f02\u6b65\u6267\u884c\uff0c\u5fc5\u987b\u4e24\u4e2a\u90fd\u5b8c\u6210\uff0c\u624d\u80fd\u7ee7\u7eed\u6267\u884c<br \/>\n&#8216;abc&#8217;,<br \/>\n&#8216;efg&#8217;<br \/>\n],<br \/>\n&#8216;mean123&#8217;,<br \/>\n&#8216;mean456&#8217;<br \/>\n]<br \/>\n\/\/\u8fd9\u6837\u7684\u8bbe\u8ba1\u89e3\u51b3\u4e86\uff0c\u5730\u72f1\u56de\u8c03\u7684\u75db\u82e6\uff0c\u800c\u4e14\u6570\u636e\u53ef\u4ee5\u5171\u4eab<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>13\uff0c\u4e0a\u4f20<\/p>\n<p>var path=require(&#8216;path&#8217;);<br \/>\nvar fs=require(&#8216;fs&#8217;);<\/p>\n<p>&nbsp;<\/p>\n<p>html:<br \/>\n&lt;form method=&#8221;post&#8221; action=&#8221;\/upload_page&#8221; enctype=&#8221;multipart\/form-data&#8221;&gt;<br \/>\n&lt;input type=&#8221;file&#8221; name=&#8221;upload&#8221;&gt;<br \/>\n&lt;input type=&#8221;submit&#8221; value=&#8221;\u4e0a\u4f20&#8221;&gt;<br \/>\n&lt;\/form&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>\u8def\u7531\uff1a<br \/>\n\/\/\u4e0a\u4f20<br \/>\nserver.route({<br \/>\nmethod:&#8217;post&#8217;,<br \/>\npath:&#8217;\/upload_page&#8217;,<br \/>\nconfig:{<br \/>\npayload:{<br \/>\noutput:&#8217;stream&#8217;,<br \/>\nparse:true,<br \/>\nmaxBytes:1048576 *4,\/\/\u5141\u8bb8\u4e0a\u4f20 4mb<br \/>\ntimeout:10000 \/\/\u4e0a\u4f20\u8d85\u65f6\u9ed8\u8ba410\u79d2<br \/>\n},<br \/>\n},<br \/>\nhandler:function (request,reply) {<br \/>\nvar upload=request.payload.upload;<br \/>\nvar uploadname=path.basename(request.payload.upload.hapi.filename);<br \/>\nvar des=path.join(__dirname,&#8217;uploads&#8217;,uploadname);<br \/>\nupload.pipe(fs.createWriteStream(des));<br \/>\nreply.view(&#8216;index&#8217;,{<br \/>\ntitle:&#8217;\u4e0a\u4f20\u5b8c\u6210&#8217;<br \/>\n});<br \/>\n}<br \/>\n});<\/p>\n<p>&nbsp;<\/p>\n<p>\u6587\u4ef6\u4f1a\u4e0a\u4f20\u5b58\u653e\u5728\u6839\u76ee\u5f55\u7684uploads\u76ee\u5f55\u4e0b<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>14\uff0c\u8bbe\u7f6e\u9ed1\u660e\u5355\uff0c\u7981\u6b62\u6307\u5b9aip\u4e0d\u80fd\u8bbf\u95ee<\/p>\n<p>npm install &#8211;save boom@3 netmask@1.0.5<\/p>\n<p>var Boom = require(&#8216;boom&#8217;);<br \/>\nvar Netmask = require(&#8216;netmask&#8217;).Netmask;<\/p>\n<p>&nbsp;<\/p>\n<p>\/\/\u9ed1\u540d\u5355<br \/>\nvar blacklist=[<br \/>\n&#8216;127.0.0.0\/8&#8217;<br \/>\n];<\/p>\n<p>\/\/&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br \/>\nvar blockips=function (request,reply) {<br \/>\nvar ip=request.info.remoteAddress; \/\/\u83b7\u53d6\u5ba2\u6237\u7aefip<br \/>\nfor(let i=0;i&lt;blacklist.length;i++){<br \/>\nvar block=new Netmask(blacklist[i]);<br \/>\nif(block.contains(ip)){ \/\/\u52a0!,blacklist\u5c31\u6210\u4e86\u767d\u540d\u5355<br \/>\nconsole.log(&#8216;\u7981\u6b62\u8be5&#8217;+ip+&#8217;ip\u8bbf\u95ee&#8217;);<br \/>\nreturn reply(Boom.forbidden()); \/\/\u5982\u679c\u6267\u884c\u5230\u8fd9\u6b65\u5c31\u505c\u6b62\u539f\u6765\u7684\u751f\u547d\u5468\u671f\uff0c\u8fd4\u56de403<br \/>\n}<br \/>\n}<\/p>\n<p>reply.continue(); \/\/\u7ee7\u7eed\u5176\u4ed6\u7684\u751f\u547d\u5468\u671f\u6d41\u7a0b\u8d70<\/p>\n<p>}<br \/>\n\/\/&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br \/>\nserver.ext(&#8216;onRequest&#8217;,blockips); \/\/\u6269\u5c55\u70b9\uff0c\u628a\u81ea\u5b9a\u4e49\u597d\u7684\u529f\u80fd\u63d2\u5165\u5230\uff0chapi\u751f\u547d\u5468\u671f\u4e2d\u6267\u884c\uff08\u53ef\u4ee5\u7406\u89e3\u4e3a\uff0c\u5ba2\u6237\u7aef\u8bbf\u95ee\u4efb\u610f\u9875\u9762\u65f6\uff0c\u603b\u4f1a\u6267\u884c\u6b64\u51fd\u6570\uff09<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>15,\u6269\u5c55\u70b9<br \/>\n\u8981\u4f7f\u7528\u6269\u5c55\u70b9\uff0c\u5c31\u8981\u4e86\u89e3\u5ba2\u6237\u7aef\u5411\u670d\u52a1\u5668\u8bf7\u6c42\u9875\u9762\u7684\u8fc7\u7a0b\uff0c\u751f\u547d\u5468\u671f\u90fd\u6709\u54ea\u4e9b\uff0c\u5e76\u5728\u4e0d\u540c\u7684\u751f\u547d\u5468\u671f\u7684\u9636\u6bb5\u4e2d\uff0c\u63d2\u5165\u6269\u5c55\u70b9\u6765\u5b9e\u73b0\u529f\u80fd\u3002<\/p>\n<p>\u53ef\u4ee5\u53c2\u770b14\u7684\u6848\u4f8b<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>16\uff0c\u5ba2\u6237\u7aefreply<br \/>\n\u4e5f\u5c31\u662f\u8d1f\u8d23\u628a\u670d\u52a1\u5668\u8fd4\u56de\u6765\u7684\u4fe1\u606f\u663e\u793a\u5230\u6d4f\u89c8\u5668\u4e2d<\/p>\n<p>&nbsp;<\/p>\n<p>handler:function(request,reply){<br \/>\nreply(&#8216;\u4f60\u597d&#8217;); \/\/reply() \u8fd4\u56de\u7684\u662f\u4e00\u4e2aresponse,\u5e76\u4e0d\u662f\u76f4\u63a5\u628a\u5b57\u7b26\u4e32\u6253\u5370\u5230\u6d4f\u89c8\u5668\u4e0a\uff0c\u6240\u4ee5\u5728\u6b64\u8fc7\u7a0b\u4e2d\u6211\u4eec\u53ef\u4ee5\u4fee\u6539\u8fd4\u56de\u5230\u6d4f\u89c8\u5668\u4e0a\u7684\u6570\u636e\u7c7b\u578b<\/p>\n<p>}<\/p>\n<p>&nbsp;<\/p>\n<p>reply.view(&#8216;index&#8217;,{<br \/>\ntitle: &#8216;fff&#8217;<br \/>\n})<br \/>\n.type(&#8216;text\/plain&#8217;) \/\/\u4e0d\u89e3\u6790html,\u76f4\u63a5\u628ahtml\u4ee3\u7801\u8f93\u51fa\u5230\u6d4f\u89c8\u5668\u4e2d<br \/>\n.code(200)<br \/>\n.header(&#8216;x-powered-by&#8217;,&#8217;hapi&#8217;); \/\/\u670d\u52a1\u5668\u7684\u5934\u4fe1\u606f,\u7c7b\u4f3c\u6ce8\u91ca\u4f5c<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>server.ext(&#8216;onPreResponse&#8217;,(request,reply)=&gt;{ \/\/onPreResponse\u4e00\u822c\u80fd\u76d1\u542c\u5230 \u9759\u6001\u8d44\u6e90\u3002\u5982\uff1aimages\u3001css,\u6216\u8005type(&#8216;text\/plain&#8217;)\u7684\u94fe\u63a5<br \/>\nconsole.log(&#8216;VVVVVVVVVVVVVVVVVVVV&#8217;);<br \/>\nconsole.log(request.response.statusCode);<br \/>\nconsole.log(request.response.headers);<br \/>\nconsole.log(&#8216;^^^^^^^^^^^^^^^^^^^^&#8217;);<br \/>\nreply.continue();<br \/>\n});<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>17,\u521b\u5efa\u8def\u7531<\/p>\n<p>&nbsp;<\/p>\n<p>\u72ec\u7acb\u521b\u5efa\u4e00\u4e2a\u8def\u7531\uff1a<br \/>\nserver.route({<br \/>\nmethod:&#8217;get&#8217;,<br \/>\npath:&#8217;\/asf&#8217;,<br \/>\nhandler:function (request,reply) {<br \/>\nreply(&#8216;\u5185\u5bb9&#8217;);<br \/>\n}<br \/>\n});<\/p>\n<p>\u8bbf\u95ee: http:\/\/127.0.0.1\/asf<\/p>\n<p>&nbsp;<\/p>\n<p>\u591a\u4e2a\u8def\u7531\uff1a<\/p>\n<p>server.route([{<br \/>\nmethod:&#8217;get&#8217;,<br \/>\npath:&#8217;\/asf&#8217;,<br \/>\nhandler:function (request,reply) {<br \/>\nreply.view(&#8216;index&#8217;,{<br \/>\ntitle:&#8217;1&#8242;<br \/>\n});<br \/>\n}<br \/>\n},<br \/>\n{<br \/>\nmethod:&#8217;get&#8217;,<br \/>\npath:&#8217;\/test&#8217;,<br \/>\nhandler:function (request,reply) {<br \/>\nreply(&#8216;\u7ee7\u7eed&#8217;);<br \/>\n}<br \/>\n},<br \/>\n{<br \/>\nmethod:&#8217;POST&#8217;,<br \/>\npath:&#8217;\/post_test&#8217;,<br \/>\nconfig:{<br \/>\npayload:{<br \/>\noutput:&#8217;data&#8217;<br \/>\n}<br \/>\n},<br \/>\nhandler:function (request,reply) {<br \/>\nreply.view(&#8216;index&#8217;,{<br \/>\ntitle:request.payload.user<br \/>\n});<br \/>\n}<br \/>\n}<br \/>\n]);<\/p>\n<p>&nbsp;<\/p>\n<p>\u53ef\u4ee5\u8bbf\u95ee:<br \/>\nhttp:\/\/127.0.0.1\/asf<br \/>\nhttp:\/\/127.0.0.1\/test<br \/>\n\u548c\u63d0\u4ea4\u6570\u636e\u5230<br \/>\nhttp:\/\/127.0.0.1\/post_test<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>18,\u9519\u8bef\u9875\u9762 404\u3001500<\/p>\n<p>&nbsp;<\/p>\n<p>var Boom = require(&#8216;boom&#8217;);<br \/>\nvar Joi=require(&#8216;joi&#8217;);<\/p>\n<p>&nbsp;<\/p>\n<p>html: error.ejs<br \/>\n&lt;p&gt;&lt;%= statuscode %&gt;&lt;\/p&gt;<br \/>\n&lt;p&gt;&lt;%= error_name %&gt;&lt;\/p&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>server.route([<br \/>\n{<br \/>\nmethod:&#8217;get&#8217;,<br \/>\npath:&#8217;\/asf\/{name}&#8217;,<br \/>\nhandler:function (request,reply) {<br \/>\nreturn reply(&#8216;ok&#8217;);<br \/>\n},<br \/>\nconfig:{<br \/>\nvalidate:{<br \/>\nparams:{<br \/>\nname:Joi.string().min(4) \/\/ \u8def\u7531\u81f3\u5c11\u8981\u5927\u4e8e\u7b49\u4e8e4\u4f4d<br \/>\n}<br \/>\n}<br \/>\n}<br \/>\n}<br \/>\n]);<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>server.ext(&#8216;onPreResponse&#8217;,(request,reply)=&gt;{<br \/>\nif(request.response.isBoom){<br \/>\nvar error_name= request.response.output.payload.error;<br \/>\nvar statuscode= request.response.output.payload.statusCode;<br \/>\nreturn reply.view(&#8216;error&#8217;,{<br \/>\nstatuscode:statuscode,<br \/>\nerror_name:error_name,<br \/>\ntitle:&#8217;\u8fd9\u91cc\u662f\u9519\u8bef\u9875\u9762&#8217;<br \/>\n}).code(statuscode);<br \/>\n}<br \/>\nreply.continue();<br \/>\n});<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>19,\u9a8c\u8bc1<\/p>\n<p>&nbsp;<\/p>\n<p>hapi\u7684\u5185\u90e8\u9a8c\u8bc1\u63a8\u8350\u4f7f\u7528\u7684joi\u6a21\u5757\uff0c\u4e00\u65e6\u8fc7\u4e0d\u4e86validate\u9a8c\u8bc1\u5c31\u4e0d\u4f1a\u6267\u884c\u5230handler\u51fd\u6570\uff0c\u76f4\u63a5\u62a5\u9519Boom\u9519\u8bef\u3002<\/p>\n<p>&nbsp;<\/p>\n<p>npm install joi@8.4.2 &#8211;save<\/p>\n<p>var Joi=require(&#8216;joi&#8217;); \/\/\u63a8\u8350\u53bb\u4e86\u89e3\u66f4\u591ajoi\u7528\u6cd5<\/p>\n<p>&nbsp;<\/p>\n<p>(1)get\u6570\u636e\u63d0\u4ea4\u9a8c\u8bc1 \uff08\u9a8c\u8bc1\u8def\u5f84\u53c2\u6570\uff09\uff1a<\/p>\n<p>method:&#8217;get&#8217;,<br \/>\npath:&#8217;\/asf\/{id}&#8217;,<br \/>\nhandler:function (request,reply) {<br \/>\nreply.view(&#8216;index&#8217;,{<br \/>\ntitle:&#8217;sfsfsdfds&#8217;<br \/>\n});<br \/>\n},<br \/>\nconfig:{<br \/>\nvalidate:{<br \/>\nparams:{<br \/>\nid:Joi.string().min(4) \/\/\u5fc5\u987b\u662f\u5b57\u7b26\u4e32\u800c\u4e14\u8981\u5927\u4e8e\u7b49\u4e8e4\u4f4d<br \/>\n}<br \/>\n}<br \/>\n}<\/p>\n<p>&nbsp;<\/p>\n<p>(2)post\u6570\u636e\u63d0\u4ea4\u9a8c\u8bc1<\/p>\n<p>method:&#8217;POST&#8217;,<br \/>\npath:&#8217;\/post_test&#8217;,<br \/>\nconfig:{<br \/>\npayload:{<br \/>\noutput:&#8217;data&#8217;<br \/>\n},<br \/>\nvalidate:{<br \/>\npayload:{<br \/>\nuser:Joi.number() \/\/ user \u662f &lt;input type=&#8221;text&#8221; name=&#8221;user&#8221; \/&gt; \u503c\u5fc5\u987b\u662f\u6570\u5b57<br \/>\n}<br \/>\n}<br \/>\n},<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>(3)\u670d\u52a1\u5668\u4f20\u7ed9\u5ba2\u670d\u7aef\u65f6\uff0c\u9a8c\u8bc1\u6570\u636e\uff08\u6bd4\u8f83\u9002\u5408\u505a\u5bf9\u5916\u63a5\u53e3\u7684\u6570\u636e\u9a8c\u8bc1\uff0c\u4f8b\u5982\u91c7\u96c6\uff09<br \/>\nmethod:&#8217;get&#8217;,<br \/>\npath:&#8217;\/asf&#8217;,<br \/>\nhandler:function (request,reply) {<br \/>\nreply({title:123}); \/\/\u8f93\u51fa\u5230\u5ba2\u6237\u7aef\u7684\u5bf9\u8c61\u4e2d,\u5176\u4e2dtitle\u5fc5\u987b\u65f6\u6570\u5b57<br \/>\n},<br \/>\nconfig:{<br \/>\nresponse:{<br \/>\nschema:{<br \/>\ntitle:Joi.number()<br \/>\n}<br \/>\n}<br \/>\n}<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>(4)\u5f53\u4ee5get\u6216\u8005post\u65b9\u5f0f\u4f20\u7ed9\u540e\u53f0\u7684\u6570\u636e\u9a8c\u8bc1\u5931\u8d25\u65f6\uff0c\u53ef\u4ee5\u89e6\u53d1\u6307\u5b9a\u9519\u8bef\u56de\u8c03<\/p>\n<p>method:&#8217;get&#8217;,<br \/>\npath:&#8217;\/asf\/{id}&#8217;,<br \/>\nhandler:function (request,reply) {<br \/>\nreply.view(&#8216;index&#8217;,{<br \/>\ntitle:&#8217;sfsfsdfds&#8217;<br \/>\n});<br \/>\n},<br \/>\nconfig:{<br \/>\nvalidate:{<br \/>\nparams:{<br \/>\nid:Joi.string().min(4) \/\/\u5fc5\u987b\u662f\u5b57\u7b26\u4e32\u800c\u4e14\u8981\u5927\u4e8e\u7b49\u4e8e4\u4f4d<br \/>\n},<br \/>\nfailAction:function (request,reply,source,error) {<br \/>\nreply(&#8216;sdf&#8217;); \/\/request,reply\u5c31\u662fhanlder\u91cc\u9762\u7684<br \/>\n\/\/source \u544a\u8bc9\u6211\u4eec\u662f\u54ea\u90e8\u5206\u51fa\u9519<br \/>\n\/\/error \u8f93\u51fa\u4e00\u4e9b\u9519\u8bef\u4fe1\u606f<br \/>\n}<br \/>\n}<br \/>\n}<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>20\uff0c\u5224\u65ad\u5ba2\u6237\u7aef\u662fpc\u7aef\u8fd8\u662f\u624b\u673a\u7aef\uff0c\u9009\u62e9\u52a0\u8f7d\u4e0d\u540c\u7684\u6a21\u7248\uff0c\u57df\u540d\u4e0d\u53d8<\/p>\n<p>npm install hapi-mobile-detect@1.3.5 &#8211;save<\/p>\n<p>&nbsp;<\/p>\n<p>const MobileDetect = require(&#8216;hapi-mobile-detect&#8217;);<\/p>\n<p>&nbsp;<\/p>\n<p>handler:function (request,reply) {<\/p>\n<p>if(!!request.plugins.md.mobile()){<br \/>\nreply.view(&#8216;.\/mobile\/index_mobile&#8217;,{<br \/>\ntitle:&#8217;\u624b\u673a&#8217;<br \/>\n});<br \/>\n}else{<br \/>\nreply.view(&#8216;index&#8217;,{<br \/>\ntitle:&#8217;pc&#8217;<br \/>\n});<br \/>\n}<\/p>\n<p>}<\/p>\n<p>&nbsp;<\/p>\n<p>.\/views\/index.ejs<br \/>\n.\/views\/mobile\/index_mobile.ejs<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>21,\u63d2\u4ef6\uff08\u4e2d\u95f4\u4ef6\uff09<\/p>\n<p>\u52a0\u8f7d\u9700\u8981\u9760:server.register\u52a0\u8f7d<br \/>\nserver.register([ \/\/\u670d\u52a1\u5668\u542f\u52a8\u65f6\uff0c\u4ec5\u4ec5\u52a0\u8f7d\u4e00\u6b21\uff0c\u800c\u4e14\u8fd8\u662f\u540c\u6b65\u6267\u884c<br \/>\n{register:require(&#8216;.\/one_module&#8217;),<br \/>\noptions:{<br \/>\nxx:&#8217;\u53c2\u6570\u503c\uff0c\u4f20\u4e2a\u63d2\u4ef6&#8217;<br \/>\n}<br \/>\n}<br \/>\n]);<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>\/\/one_module.js<\/p>\n<p>exports.register=function (server,options,next) {<br \/>\nconsole.log(&#8216;\u5de5\u4f5c\u4e86&#8217;+options.xx); \/\/\u5de5\u4f5c\u4e86\u53c2\u6570\u503c\uff0c\u4f20\u4e2a\u63d2\u4ef6<br \/>\nnext();<br \/>\n};<\/p>\n<p>exports.register.attributes={ pkg:require(&#8220;..\/package.json&#8221;) };<\/p>\n<p>&nbsp;<\/p>\n<p>\u5982\u679c\u63d2\u4ef6\u4f9d\u8d56\u67d0\u4e2a\u6a21\u5757\uff0c\u53ef\u4ee5\u4f7f\u7528\uff1a<br \/>\nexports.register=function (server,options,next) {<br \/>\nserver.dependency([&#8216;vision&#8217;,&#8217;good&#8217;],function (server,next) {<br \/>\nconsole.log(&#8216;adsfafas&#8217;);<br \/>\nnext();<br \/>\n});<br \/>\nnext();<br \/>\n};<\/p>\n<p>exports.register.attributes={ pkg:require(&#8220;..\/package.json&#8221;) };<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>22,\u670d\u52a1\u5668\u9759\u6001\u6570\u636e<\/p>\n<p>var server=new Hapi.Server({<br \/>\napp:{<br \/>\nxx:&#8217;\u8fd9\u91cc\u662f\u81ea\u5b9a\u4e49\u503c&#8217;<br \/>\n}<br \/>\n});<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>\u5728\u8def\u7531\u4e2d\u83b7\u53d6\uff1a<\/p>\n<p>handler:function (request,reply) {<br \/>\nrequest.server.settings.app.xx<br \/>\n},<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>23,\u7f13\u5b58<\/p>\n<p>&nbsp;<\/p>\n<p>\u5ba2\u6237\u7aef\u7f13\u5b58\uff1a<br \/>\nserver.route({<br \/>\nmethod:&#8217;GET&#8217;,<br \/>\npath:&#8217;\/{param*}&#8217;,<br \/>\nhandler:{<br \/>\ndirectory:{<br \/>\npath:&#8217;public&#8217;<br \/>\n}<br \/>\n},<br \/>\nconfig:{<br \/>\ncache:{<br \/>\nprivacy:&#8217;private&#8217;,<br \/>\nexpiresIn:86400*1000 \/\/\u4e3a\u9759\u6001\u8d44\u6e90\u7f13\u5b58<br \/>\n}<br \/>\n}<br \/>\n});<\/p>\n<p>&nbsp;<\/p>\n<p>\u540c\u6837\u4e5f\u53ef\u4ee5\u5728\u8def\u7531\u5668\u4e2d\u914d\u7f6e\uff0c\u7f13\u5b58\u9875\u9762\u3002<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u672c\u6559\u7a0b\u57fa\u4e8ehapi@13.5.3 &#8220;dependencies&#8221;: { &#8220;boom&#8221;: &#8220;^3.2.2&#8221;, &#8220;e [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[11],"tags":[],"class_list":["post-6109","post","type-post","status-publish","format-standard","hentry","category-11"],"_links":{"self":[{"href":"https:\/\/sdeno.com\/index.php?rest_route=\/wp\/v2\/posts\/6109","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=6109"}],"version-history":[{"count":0,"href":"https:\/\/sdeno.com\/index.php?rest_route=\/wp\/v2\/posts\/6109\/revisions"}],"wp:attachment":[{"href":"https:\/\/sdeno.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=6109"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sdeno.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=6109"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sdeno.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=6109"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}