Почему мой ctx.request.files не определен, а ctx.request.body в порядке? - PullRequest
1 голос
/ 19 января 2020

Я пытаюсь проанализировать данные из моей простой формы, используя koa-body, но при обработке пост-запроса я могу получить доступ только к ctx.request.body, но не к ctx.request.files. Я пробовал несколько вариантов решения этой проблемы, но это не сработало, в любом случае ctx.request.files пуст. Написал код в соответствии с этим примером: koa-body / examples / multipart. js . Есть код:

рег. 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;

рег.пуг

     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

приложение. 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'
  }

Ответы [ 2 ]

1 голос
/ 21 января 2020

У меня была такая же проблема в новом проекте. Это проблема в новой версии koa-body . Я изменил версию koa-body с "^ 4.1.1" на "^ 2.5.0" . Теперь он работает нормально.

Для обновления используйте команду:

npm remove koa-body

Установите старую версию:

npm install koa-body@2.5.0

Теперь все будет работать нормально.

0 голосов
/ 26 февраля 2020

Существует два способа реализации 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 не определен, убедитесь, что ваша форма публикации настроена на кодирование данных публикации в 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>
...