我正在尝试为我的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)
一切正常。有人可以解释我为什么吗?谢谢。
答案 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>