From 162ac128bd0df162d51de78a563bba1b06a9bc48 Mon Sep 17 00:00:00 2001 From: jconsigliere Date: Wed, 28 Dec 2016 08:29:56 +0000 Subject: [PATCH 1/4] Feat: add body getter --- index.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/index.js b/index.js index dc8a68d..8b5bc6f 100644 --- a/index.js +++ b/index.js @@ -92,18 +92,18 @@ function createGetter(str) { return createHeaderGetter(str) } - return createQueryGetter(str) + return createQueryOrBodyGetter(str) } /** - * Create a getter for the given query key name. + * Create a getter for the given query or body key name. */ -function createQueryGetter(key) { - return queryGetter +function createQueryOrBodyGetter(key) { + return queryOrBodyGetter - function queryGetter(req) { - return req.query[key] + function queryOrBodyGetter(req) { + return req.query[key] || req.body[key] } } From f6eb43ee6121d5c6bc7a13d9a1a33fd15c77a412 Mon Sep 17 00:00:00 2001 From: jconsigliere Date: Wed, 28 Dec 2016 08:43:51 +0000 Subject: [PATCH 2/4] Fix: pass test --- index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.js b/index.js index 8b5bc6f..e53bfbc 100644 --- a/index.js +++ b/index.js @@ -103,7 +103,7 @@ function createQueryOrBodyGetter(key) { return queryOrBodyGetter function queryOrBodyGetter(req) { - return req.query[key] || req.body[key] + return req.query[key] || (req.body && req.body[key]) } } From b56991521d5614971a845e5046e2c542d68ba3c8 Mon Sep 17 00:00:00 2001 From: jconsigliere Date: Thu, 29 Dec 2016 13:24:11 +0000 Subject: [PATCH 3/4] Feat: add async-busboy for multipart/formdata enctype --- index.js | 21 +++++++++++++++++---- package.json | 1 + 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/index.js b/index.js index e53bfbc..cb724bb 100644 --- a/index.js +++ b/index.js @@ -16,10 +16,13 @@ const debug = require('debug')('method-override') const methods = require('methods') +const asyncBusboy = require('async-busboy') const ALLOWED_METHODS = 'POST' const HTTP_METHOD_OVERRIDE_HEADER = "X-HTTP-Method-Override" +let asyncBusboyBody = null + /** * Method Override: * @@ -57,7 +60,7 @@ function methodOverride(getter, options) { ? ALLOWED_METHODS.split(' ') : options.methods - return (ctx, next) => { + return async (ctx, next) => { const req = ctx.request let method let val @@ -69,7 +72,10 @@ function methodOverride(getter, options) { return next() } - val = get(req, ctx.response) + asyncBusboyBody = null + ctx.req.getAsyncBusboyBody = async () => (asyncBusboyBody || await asyncBusboy(ctx.req)) + + val = await get(req, ctx.response, ctx.req) method = Array.isArray(val) ? val[0] : val // replace @@ -102,8 +108,15 @@ function createGetter(str) { function createQueryOrBodyGetter(key) { return queryOrBodyGetter - function queryOrBodyGetter(req) { - return req.query[key] || (req.body && req.body[key]) + async function queryOrBodyGetter(req, ...args) { + const method = req.query[key] || (req.body && req.body[key]) + if (method) { + return method + } else { + const koaReq = args[1] + asyncBusboyBody = await asyncBusboy(koaReq) + return asyncBusboyBody.fields[key] + } } } diff --git a/package.json b/package.json index 5227af7..3885d60 100644 --- a/package.json +++ b/package.json @@ -18,6 +18,7 @@ "middleware" ], "dependencies": { + "async-busboy": "^0.3.3", "debug": "*", "methods": "*" }, From 81a47a78eff43240b0708e895bd9824ca50b64ba Mon Sep 17 00:00:00 2001 From: jconsigliere Date: Thu, 29 Dec 2016 13:28:06 +0000 Subject: [PATCH 4/4] Doc: update README --- README.md | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 15a3bc0..917dfc4 100644 --- a/README.md +++ b/README.md @@ -26,11 +26,22 @@ npm install koa-methodoverride var app = require('koa')(); var methodOverride = require('koa-methodoverride'); -app.use(methodOverride()); +app.use(methodOverride('_method')); app.listen(3000); ``` +This package leverages [async-busboy](https://github.com/m4nuC/async-busboy) for `multipart/formdata` enctype. +For those who want to read files and fields in this case, a new helper method `ctx.req.getAsyncBusboyBody()` is exposed. +Thus, instead of +```js +const { files, fields } = await asyncBusboy(ctx.req); +``` +, you need to use +```js +const { files, fields } = await ctx.req.getAsyncBusboyBody(); +``` + ### License