mongoose findbyId内部错误

时间:2016-02-12 23:37:30

标签: mongoose koa koa-router koa2

我正在使用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;
如果我转到网址http://localhost:3000/api/users/

获得结果就可以了

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

但是如果我在浏览器http://localhost:3000/api/users/56bc57c48cc9e78b4ce61206中执行get by id 什么都没发生,没有错误。浏览器只是加载我以前的网页。

如果我将id更改为一个不存在的id,我在浏览器中出现了内部错误。它显示在终端:

   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)

1 个答案:

答案 0 :(得分:1)

Mongoose希望传递给.findById()的有效ObjectId,'sfggf'不是,这就是你得到内部错误的原因。只需看看this question

另外我建议使用mongoose.Types.ObjectId.isValid()代替if(/*regex is valid*/) - 但我可能错了。