внутренняя ошибка мангуста findbyId

Я использую Koa 2 и koa-router.

Файл роутера:

import User from '../models/user'
var router = require('koa-router')();
router
  .get('/', async ctx => ctx.body = await User.find({}))
  .get('/:id', async (ctx, next) =>
    ctx.body = await User.findById(ctx.params.id))
module.exports = router;

получить результаты нормально, если я перехожу по URL-адресу http://localhost:3000/api/users/ :

[{"_id":"56bc57c48cc9e78b4ce61206","index":3,"isActive":true,"name":"Price","surname":"Shelton","email":"[email protected]","phone":"+1 (863) 516-2166","address":"587 Classon Avenue, Grapeview, New Jersey, 7382"},{"_id":"56bc57c47bb0e8884071eb00","index":1,"isActive":false,"name":"Noble","surname":"Downs","email":"[email protected]","phone":"+1 (812) 412-3775","address":"357 River Street, Chelsea, District Of Columbia, 5938"},
....

Однако, если я выполню get by id в браузере http://localhost:3000/api/users/56bc57c48cc9e78b4ce61206, ничего не произойдет, никакой ошибки. Браузер просто загружает веб-страницу, которая у меня была раньше.

Если я изменю идентификатор на несуществующий, я получу внутреннюю ошибку в браузере. В терминале показывает:

   CastError: Cast to ObjectId failed for value "sfggf" at path "_id"
      at MongooseError.CastError (/home/juanda/koa2-api/node_modules/mongoose/lib/error/cast.js:19:11)
      at ObjectId.cast (/home/juanda/koa2-api/node_modules/mongoose/lib/schema/objectid.js:136:13)
      at ObjectId.castForQuery (/home/juanda/koa2-api/node_modules/mongoose/lib/schema/objectid.js:176:15)
      at cast (/home/juanda/koa2-api/node_modules/mongoose/lib/cast.js:174:32)
      at Query.cast (/home/juanda/koa2-api/node_modules/mongoose/lib/query.js:2542:10)
      at Query.findOne (/home/juanda/koa2-api/node_modules/mongoose/lib/query.js:1239:10)
      at /home/juanda/koa2-api/node_modules/mongoose/lib/query.js:2143:21
      at new Promise.ES6 (/home/juanda/koa2-api/node_modules/mongoose/lib/promise.js:45:3)
      at Query.exec (/home/juanda/koa2-api/node_modules/mongoose/lib/query.js:2136:10)
      at Query.then (/home/juanda/koa2-api/node_modules/mongoose/lib/query.js:2166:15)

person user2670996    schedule 12.02.2016    source источник
comment
Попробуйте get('/api/users/:id', async (ctx, next) для URL localhost:3000/api/users/56bc57c48cc9e78b4ce61206   -  person zangw    schedule 13.02.2016
comment
На самом деле я не отвечаю на вопрос, но вы неправильно используете мангуст и async/await. Вы используете await для синхронных функций (find(), findById()). Взгляните на Bluebird и, возможно, это   -  person Cohars    schedule 04.03.2016
comment
Mongoose 4 возвращает обещания, поэтому он работает с async/await.   -  person user2670996    schedule 04.03.2016


Ответы (1)


Mongoose хочет, чтобы действительный ObjectId передавался в .findById(), а 'sfggf' не является, поэтому вы получаете внутреннюю ошибку. Просто взгляните на этот вопрос.

Кроме того, я бы рекомендовал использовать mongoose.Types.ObjectId.isValid() вместо if(/*regex is valid*/), но могу ошибаться.

person Cohars    schedule 04.03.2016