我正在尝试使用 koa-body 解析简单表单中的数据,但在请求后处理中我只能访问 ctx.request.body ,但不能访问 ctx.request.files 。我尝试了几个选项来解决这个问题,但它不起作用,ctx.request.files 无论如何都是空的。根据这个例子编写代码:koa-body/examples/multipart.js。有代码:
\n\nreg.js
\n\nconst 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;\nRun 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\nRun Code Online (Sandbox Code Playgroud)\n\n应用程序.js
\n\nconst 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\')\nRun 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 }\nRun 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-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)
| 归档时间: |
|
| 查看次数: |
4840 次 |
| 最近记录: |