为什么我的 ctx.request.files 未定义,而 ctx.request.body 可以?
Why my ctx.request.files is undefined, while ctx.request.body is ok?
我正在尝试使用 koa-body 从我的简单表单中解析数据,但在 post 请求处理中我只能访问 ctx.request.body,但不能访问 ctx.request.files。我尝试了几个选项来解决这个问题,但没有成功,ctx.request.files 无论如何都是空的。按照这个例子写代码:koa-body/examples/multipart.js 。有代码:
reg.js
const router = require('koa-router')();
const bodyParser = require('koa-body')({multipart:true});
router.post('/reg', bodyParser, async (ctx) => {
console.dir(ctx.request);
});
module.exports = router;
reg.pug
form(method='POST' action='/reg')
label Логин
input(type="text" id="login" name="login")
label Почта
input(type="text" name="mail")
label Пароль
input(type="password" name="password")
label Специализация
input(type="text" name="specialism")
label Пол
select(name="sex")
option(value="male") Мужрской
option(value="female") Женский
label Фото
input(type="file" name="image")
button(type="submit" value="Sign up") Sign Up
app.js
const Koa = require('koa');
const Pug = require('koa-pug');
const serve = require('koa-static');
const path = require('path');
const logger = require('koa-morgan');
const mongoDB = require('./config/database');
const homeRoute = require('./routes/home');
const regRoute = require('./routes/reg');
const app = new Koa();
// Connection to Mongoose
mongoDB.connect();
app.use(logger('dev'));
// Error-middleware handler
app.use(async(ctx, next) => {
try {
await next();
const status = ctx.status || 404;
if (status === 404) {
ctx.throw(404)
}
} catch (err) {
ctx.status = err.status || 500;
pug.locals.status = ctx.status;
if (ctx.status === 404) {
//Your 404.jade
await ctx.render('404error', pug.locals)
} else {
//other_error jade
await ctx.render('index', pug.locals)
}
}
});
app.use(serve(`${__dirname}/public`));
const pug = new Pug({
viewPath: path.resolve(__dirname, './views'),
locals: { },
app: app
});
app.use(homeRoute.routes());
app.use(regRoute.routes());
app.listen(3000, function(){
console.log('Server running on https://localhost:3000')
这就是 ctx.request.body 包含的内容:
body: {
login: 'check',
mail: '123',
password: '123',
specialism: 'check',
sex: 'male',
image: 'SnWyoGZWgDA.jpg'
}
我在一个新项目中遇到了同样的问题。这是 koa-body 新版本中的一个问题。
我将 koa-body 版本从 "^4.1.1" 更改为 "^2.5.0" .现在一切正常。
更新使用命令:
npm remove koa-body
安装旧版本:
npm install koa-body@2.5.0
现在可以正常使用了。
有两种方法可以在您的应用中实现 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)
使用 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)
我已经测试了 koa-body@4.1.1
,这两种方法都适用于上述示例。
疑难解答
如果 ctx.request.files
对象未定义,请确保您的 post 表单设置为对 multipart/form-data
中的 post 数据进行编码。如果表单包含文件上传,这一点非常重要。
<form action="/" method="post" enctype="multipart/form-data">
<input class="file" id="file" type="file" name="file">
<input type="submit" value="Submit">
</form>
我正在尝试使用 koa-body 从我的简单表单中解析数据,但在 post 请求处理中我只能访问 ctx.request.body,但不能访问 ctx.request.files。我尝试了几个选项来解决这个问题,但没有成功,ctx.request.files 无论如何都是空的。按照这个例子写代码:koa-body/examples/multipart.js 。有代码:
reg.js
const router = require('koa-router')();
const bodyParser = require('koa-body')({multipart:true});
router.post('/reg', bodyParser, async (ctx) => {
console.dir(ctx.request);
});
module.exports = router;
reg.pug
form(method='POST' action='/reg')
label Логин
input(type="text" id="login" name="login")
label Почта
input(type="text" name="mail")
label Пароль
input(type="password" name="password")
label Специализация
input(type="text" name="specialism")
label Пол
select(name="sex")
option(value="male") Мужрской
option(value="female") Женский
label Фото
input(type="file" name="image")
button(type="submit" value="Sign up") Sign Up
app.js
const Koa = require('koa');
const Pug = require('koa-pug');
const serve = require('koa-static');
const path = require('path');
const logger = require('koa-morgan');
const mongoDB = require('./config/database');
const homeRoute = require('./routes/home');
const regRoute = require('./routes/reg');
const app = new Koa();
// Connection to Mongoose
mongoDB.connect();
app.use(logger('dev'));
// Error-middleware handler
app.use(async(ctx, next) => {
try {
await next();
const status = ctx.status || 404;
if (status === 404) {
ctx.throw(404)
}
} catch (err) {
ctx.status = err.status || 500;
pug.locals.status = ctx.status;
if (ctx.status === 404) {
//Your 404.jade
await ctx.render('404error', pug.locals)
} else {
//other_error jade
await ctx.render('index', pug.locals)
}
}
});
app.use(serve(`${__dirname}/public`));
const pug = new Pug({
viewPath: path.resolve(__dirname, './views'),
locals: { },
app: app
});
app.use(homeRoute.routes());
app.use(regRoute.routes());
app.listen(3000, function(){
console.log('Server running on https://localhost:3000')
这就是 ctx.request.body 包含的内容:
body: {
login: 'check',
mail: '123',
password: '123',
specialism: 'check',
sex: 'male',
image: 'SnWyoGZWgDA.jpg'
}
我在一个新项目中遇到了同样的问题。这是 koa-body 新版本中的一个问题。 我将 koa-body 版本从 "^4.1.1" 更改为 "^2.5.0" .现在一切正常。
更新使用命令:
npm remove koa-body
安装旧版本:
npm install koa-body@2.5.0
现在可以正常使用了。
有两种方法可以在您的应用中实现 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)
使用 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)
我已经测试了 koa-body@4.1.1
,这两种方法都适用于上述示例。
疑难解答
如果 ctx.request.files
对象未定义,请确保您的 post 表单设置为对 multipart/form-data
中的 post 数据进行编码。如果表单包含文件上传,这一点非常重要。
<form action="/" method="post" enctype="multipart/form-data">
<input class="file" id="file" type="file" name="file">
<input type="submit" value="Submit">
</form>