Ошибка Koa-Bodyparser при отправке запроса POST неверным JSON, поддерживает только объект и массив

Я пытаюсь отправить запрос Ajax POST с некоторыми параметрами моему приложению koa, но я продолжаю получать эту странную ошибку от koa-bodyparser каждый раз, когда выполняю запрос:

Ошибка: неверный JSON, поддерживает только объект и массив при разборе (/home/denis/WEB/nodejs/kinfs/node_modules/co-body/lib/json.js:55:13) в /home/denis/WEB/nodejs/ kinfs/node_modules/co-body/lib/json.js:41:16 в process._tickCallback (внутренний/процесс/next_tick.js:103:7)

и на стороне клиента я получаю эту ошибку, напечатанную в консоли браузера:

jquery-1.12.3.js:10261 POST http://localhost:3000/api/v1/books 400 (неверный запрос)

Я отправляю обычный запрос jquery ajax следующим образом:

$.ajax({
  url: '/api/v1/books',
  data: {test: 'test-data'},
  dataType: 'json',
  contentType:  'application/json',
  type: 'POST'
});

и код, который обрабатывает запрос, приведен ниже:

const Koa = require('koa');
const bodyParser = require('koa-bodyparser');
const router = require('koa-router')();
const api = require('koa-router')({
    prefix: '/api/v1'
});
// I require 'koa-router' twice because
// 'api' and 'router' objects are originally located
// in different files, but here I've put them all
// together for conciseness.

router
    .get('home', '/', async (ctx, next) => { //...// })
    .get('test', '/test', async (ctx, next) => { //...// });

const app = new Koa();

api
    .get('/books', async (ctx, next) => {
        const books = await executePLSQL();
        const data = {
            data: prepareData(books)
        };
        ctx.body = JSON.stringify(data);
    })
    .post('/books', async (ctx, next) => {
        console.log('Test POST request:');
        console.log(ctx.request.body);
        console.log(ctx.params);

        ctx.status = 201;
    });

app
    .use(bodyParser())
    .use(router.routes())
    .use(api.routes())
    .use(api.allowedMethods())
    .use(router.allowedMethods());

app.listen(3000);

Отправка запросов GET работает нормально, но когда я пытаюсь отправить запрос POST, я получаю ошибку, описанную выше.

И вот еще что:

Когда я не указываю content-type в своем запросе Ajax, ошибка не появляется. Вместо этого я печатаю это в консоли node.js (обратите внимание на вызовы console.log в api.post(...)):

Test POST request:
{ undefined: '' }
{}

Кажется, я не понимаю, что здесь происходит и почему появляется такая ошибка.

Не могли бы вы объяснить, почему появляется такая ошибка, и помочь мне решить эту проблему?


person Denis Yakovenko    schedule 26.11.2016    source источник


Ответы (2)


Решил это, указав поле data в запросе Ajax.

По сути, я изменил свой запрос Ajax на это:

$.ajax({
  url: '/api/v1/books',
  data: JSON.stringify({test: 'test-data'}),
  dataType: 'json',
  contentType:  'application/json',
  type: 'POST'
});

и после этого я начал получать данные на свой сервер внутри объекта ctx.request body.

person Denis Yakovenko    schedule 27.11.2016

Не уверен, что это поможет кому-либо, я пытался отправить строку данных в Google Cloud Task, поэтому перешел на отправку объекта.

await client.createTask(
            { internalId: payload.internalId },
            payload.delayInSeconds,
            {
                headers: {
                    Authorization: `Bearer ${process.env.AUTH_TOKEN}1`,
                    "Content-Type": "application/json",
                },
            },
        );

Что-то вроде этого. Здесь нужно научиться не отправлять строку в теле вместо допустимого объекта. Был бы комментарий, но он не привлечет много внимания.

person Black Mamba    schedule 01.06.2020