koa restApi无法将未定义或null转换为对象

时间:2018-12-05 22:12:53

标签: javascript rest koa

我正在尝试为我的koa服务器构建一个简单的restapi。

这是我的代码

const Koa = require('koa');
const app = new Koa();
const json = require('koa-json')
let Router = require('koa-router');
let router = new Router();


let users = [
    { name: 'Kevin', email: 'k@gmail.com' },
    { name: 'Star', email: 'sss@gmail.com' },
    { name: 'Vick', email: 'V@gmail.com' },
]

router
    .get('/user', list)
    .get('/user/:id', detail)
    .post('/user/:id', update)
    .post('/user/create', create)

function list(ctx) {
    ctx.body = users
}

function detail(ctx) {
    ctx.body = users[ctx.params.id]
}

function create(ctx) {
    new_user = ctx.request.body
    users.push(new_user)
    ctx.body = users
}

function update(ctx) {
    ctx.body = Object.assign(users[ctx.params.id], ctx.request.body)
}

当我尝试运行post create方法时,出现此错误。

TypeError: Cannot convert undefined or null to object
      at Function.assign (<anonymous>)
      at update (E:\project\javascript\nodejs\KoaAPI\person\server.js:38:20)

我确实使用了post方法,并且输入的网址是用户/创建,我什至没有运行post update方法。

但是,当我切换代码顺序时,请将创建后的帖子放在这样的更新之前:

router
    .get('/user', list)
    .get('/user/:id', detail)
    .post('/user/create', create)
    .post('/user/:id', update)

一切正常。有人可以解释我为什么吗?谢谢。

1 个答案:

答案 0 :(得分:1)

原因是路由器根据路由声明调用了第一个匹配的URL(使用相同的HTTP方法)。在您的情况下,URL为.post('/user/:id')时将调用/user/create的HTTP处理程序,因为路由器会尝试按照路由声明的顺序匹配URL。要检查的第一个正则表达式为/user/.*'/user/:id'会被粗略地翻译为该表达式),并且它与字符串/user/create相匹配,因此它将跳过检查其余的路由声明(不管逻辑上是否更好地匹配,都不会专门检查.post('/user/create'),并将立即调用找到的第一个处理程序。

您正确观察到的解决方法是先声明更具体的路由-如果在/user/create之前声明/user/:id,则对/user/create的请求将调用您最初期望的处理程序。 / p>