1

いくつかのパラメーターを含む Ajax POST リクエストを koa アプリに送信しようとしていますが、リクエストを実行するたびに koa-bodyparser からこの奇妙なエラーが発生し続けます。

エラー: 無効な JSON、/home/denis/WEB/nodejs/ の解析 (/home/denis/WEB/nodejs/kinfs/node_modules/co-body/lib/json.js:55:13) でのみオブジェクトと配列をサポートしますkinfs/node_modules/co-body/lib/json.js:41:16 at process._tickCallback (internal/process/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 リクエストを送信しようとすると、上記のエラーが発生します。

そして、ここに別のことがあります:

Ajax リクエストで指定content-typeしない場合、エラーは表示されません。これを node.js コンソールに出力します ( のconsole.log呼び出しに注意してくださいapi.post(...))。

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

ここで何が起こっているのか、なぜそのようなエラーが表示されるのか理解していないようです。

このようなエラーが表示される理由を説明し、その問題を解決するのを手伝っていただけますか?

4

2 に答える 2

1

dataAjax リクエストのフィールドを文字列化することで解決しました。

基本的に、Ajax リクエストを次のように変更しました。

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

その後、ctx.request bodyオブジェクト内のサーバーでデータを受信し始めました。

于 2016-11-27T05:41:55.700 に答える