koa restApi Невозможно преобразовать неопределенный или нулевой объект - PullRequest
0 голосов
/ 06 декабря 2018

Я пытаюсь создать простую реставрацию для моего сервера коа.

вот мой код

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, а введенный URL был user / create, я даже не запускал метод post * .

Однако, когдаЯ переключаю порядок кода, ставлю пост создания до обновления, как это:

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

Все работает отлично.Может кто-нибудь объяснить мне, почему?Спасибо.

1 Ответ

0 голосов
/ 06 декабря 2018

Причина в том, что маршрутизатор вызывает первый соответствующий URL (с тем же методом HTTP) в соответствии с объявлением маршрутов.В вашем случае обработчик HTTP для .post('/user/:id') будет вызываться, когда URL-адрес /user/create, потому что маршрутизатор пытается сопоставить URL-адрес в порядке объявления маршрутов.Первое регулярное выражение, которое нужно проверить: /user/.* ('/user/:id' будет примерно переведено на это) и соответствует строке /user/create, поэтому пропустит проверку остальных объявлений маршрута (специально не проверяется на .post('/user/create') независимо от логического соответствия) и немедленно вызовет первый найденный обработчик.

Исправление, как вы правильно заметили, - сначала объявить более конкретные маршруты - если вы объявите /user/create перед /user/:idзапрос на /user/create вызовет обработчик, который вы изначально ожидали.

...