Error: invalid JSON, only supports object and array:报错详解

5 篇文章 1 订阅
3 篇文章 0 订阅

问题重现:

问题大意:发送POST请求时发送Koa-Bodyparser错误“无效的JSON,仅支持对象和数组”。此问题是使用koa开发的时候出现的,当我使用postman发送post请求时,后端使用koa-bodyparser接收数据时,出现了这个错误。

后端代码:

main.ts:

import * as Koa from 'koa';
import { useControllers } from "koa-controllers";
import db from './models';
import * as koaBodyparser  from 'koa-bodyparser'

let app = new Koa();

app.use( async (ctx: Koa.Context, next) => {

    // 把db对象等其他一些数据挂在到当前的state下面
    ctx.state.db = db;

    await next();
} );

app.use(koaBodyparser());

useControllers(app, __dirname + '/controllers/**/*.controller.js', {
    multipart: {
        dest: './uploads'
    }
});

app.listen(3000);

controller.ts:

import {Controller,Get,Ctx,Post} from 'koa-controllers';
import {Context} from 'koa';
import db from '../models';
import {
  Model
} from "sequelize";

@Controller
export class AdminCategoryController {

  @Get('/admin/category')
  public async index(@Ctx ctx: Context) {

    let categoryModel = await <Model<any, any>>ctx.state.db['category'].findAll()
    
    ctx.body = categoryModel
  }
  @Post('/admin/category')
  public async add(@Ctx ctx: Context) {
    let pid = ctx.request.body.pid || 0
    let name = ctx.request.body.name || 0
    console.log(ctx.request.body); 
  }
}
postman请求:

在这里插入图片描述

错误展示:

在这里插入图片描述

解决方法:

主要原因还是post发送的数据格式问题,后端Koa-Bodyparser接受不了,如果传入后台的是字符串也不行,所以这边需要传入对象。所以需要先设置请求头 'Content-Type' : 'application/json;charset=utf-8'然后数据用json对象格式,如下:
postman:
在这里插入图片描述
在js里面其实不用考虑这个问题,一般axios发送post请求,请求头就是这个格式,传递数据需要是对象格式:

vue.js:

axios({
   method:'post',
   url:'/api/admin/category',
   data:{name: 'test-data',pid:0}
})

使用Ajax发送可以这样写:
ajax.js:

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

最终效果:

在这里插入图片描述
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值