为什么我的 ctx.request.files 未定义,而 ctx.request.body 可以?

Абд*_*лла 3 post node.js koa

我正在尝试使用 koa-body 解析简单表单中的数据,但在请求后处理中我只能访问 ctx.request.body ,但不能访问 ctx.request.files 。我尝试了几个选项来解决这个问题,但它不起作用,ctx.request.files 无论如何都是空的。根据这个例子编写代码:koa-body/examples/multipart.js。有代码:

\n\n

reg.js

\n\n
const router = require(\'koa-router\')();\nconst bodyParser = require(\'koa-body\')({multipart:true});\n\nrouter.post(\'/reg\', bodyParser,  async (ctx) => {\n        console.dir(ctx.request);\n});\n\nmodule.exports = router;\n
Run Code Online (Sandbox Code Playgroud)\n\n

注册哈巴狗

\n\n
     form(method=\'POST\' action=\'/reg\')\n                    label \xd0\x9b\xd0\xbe\xd0\xb3\xd0\xb8\xd0\xbd\n                    input(type="text" id="login" name="login")\n                    label \xd0\x9f\xd0\xbe\xd1\x87\xd1\x82\xd0\xb0\n                    input(type="text" name="mail")\n                    label \xd0\x9f\xd0\xb0\xd1\x80\xd0\xbe\xd0\xbb\xd1\x8c\n                    input(type="password" name="password")\n                    label \xd0\xa1\xd0\xbf\xd0\xb5\xd1\x86\xd0\xb8\xd0\xb0\xd0\xbb\xd0\xb8\xd0\xb7\xd0\xb0\xd1\x86\xd0\xb8\xd1\x8f\n                    input(type="text" name="specialism")\n                    label \xd0\x9f\xd0\xbe\xd0\xbb\n                    select(name="sex")\n                        option(value="male") \xd0\x9c\xd1\x83\xd0\xb6\xd1\x80\xd1\x81\xd0\xba\xd0\xbe\xd0\xb9\n                        option(value="female") \xd0\x96\xd0\xb5\xd0\xbd\xd1\x81\xd0\xba\xd0\xb8\xd0\xb9\n                    label \xd0\xa4\xd0\xbe\xd1\x82\xd0\xbe\n                    input(type="file" name="image")\n                    button(type="submit" value="Sign up") Sign Up\n
Run Code Online (Sandbox Code Playgroud)\n\n

应用程序.js

\n\n
const Koa = require(\'koa\');\nconst Pug = require(\'koa-pug\');\nconst serve = require(\'koa-static\');\nconst path = require(\'path\');\nconst logger = require(\'koa-morgan\');\n\nconst mongoDB = require(\'./config/database\');\nconst homeRoute = require(\'./routes/home\');\nconst regRoute = require(\'./routes/reg\');\n\nconst app = new Koa();\n\n// Connection to Mongoose\nmongoDB.connect();\n\napp.use(logger(\'dev\'));\n\n// Error-middleware handler\napp.use(async(ctx, next) => {\n    try {\n        await next();\n        const status = ctx.status || 404;\n        if (status === 404) {\n            ctx.throw(404)\n        }\n    } catch (err) {\n        ctx.status = err.status || 500;\n        pug.locals.status = ctx.status;\n        if (ctx.status === 404) {\n            //Your 404.jade\n            await ctx.render(\'404error\', pug.locals)\n        } else {\n            //other_error jade\n            await ctx.render(\'index\', pug.locals)\n        }\n    }\n});\n\napp.use(serve(`${__dirname}/public`));\n\nconst pug = new Pug({\n    viewPath: path.resolve(__dirname, \'./views\'),\n    locals: { },\n    app: app\n});\n\napp.use(homeRoute.routes());\napp.use(regRoute.routes());\n\napp.listen(3000, function(){\n    console.log(\'Server running on https://localhost:3000\')\n
Run Code Online (Sandbox Code Playgroud)\n\n

这就是 ctx.request.body 包含的内容:

\n\n
 body: {\n    login: \'check\',\n    mail: \'123\',\n    password: \'123\',\n    specialism: \'check\',\n    sex: \'male\',\n    image: \'SnWyoGZWgDA.jpg\'\n  }\n
Run Code Online (Sandbox Code Playgroud)\n

小智 5

在您的应用程序中实现 koa-body 有两种方法:

快速入门(不推荐)

const Koa = require('koa')
const koaBody = require('koa-body')

const app = new Koa()

// Apply Koa-Body To All Routes
app.use(koaBody())

app.listen(3000)
Run Code Online (Sandbox Code Playgroud)

与 koa-router 一起使用

如果您使用支持中间件组合的路由器,您应该仅将 koa-body 应用于所需的路由。

const Koa = require('koa')
const Router = require('koa-router')
const KoaBody = require('koa-body')({multipart:true})

const app = new Koa()
const router = new Router()

// Apply Koa-Body to this route
router.post('/', KoaBody, async ctx=> {
     console.log(ctx.request.body)
     console.log(ctx.request.files)
 })

app.use(router.routes())
app.listen(3000)

Run Code Online (Sandbox Code Playgroud)

我已经测试过koa-body@4.1.1,这两种方法都适用于上面的示例。

故障排除

如果该ctx.request.files对象未定义,请确保您的帖子表单设置为以multipart/form-data. 如果表单包含文件上传,这一点非常重要。

<form action="/" method="post" enctype="multipart/form-data">
  <input class="file" id="file" type="file" name="file">
  <input type="submit" value="Submit">
</form>
Run Code Online (Sandbox Code Playgroud)