restfull路由如下:

router.get('/:id', controller.show);

mongoes代码如下:
exports.show = function(req, res) {
Notice.findById(req.params.id, function (err, notice) {
if(err) {
res.json({no:0,msg:'获取失败:'+err});
}else{
var result = {no:1};
result.obj=notice;
res.json(result);
}
});
};

客户端访问:

http://192.168.0.165:9000/api/notices/11

打印结果如下;

{
"no": 0,
"msg": "获取失败:CastError: Cast to ObjectId failed for value \"11\" at path \"_id\""
}

具体原因参考:

http://stackoverflow.com/questions/14940660/whats-mongoose-error-cast-to-objectid-failed-for-value-xxx-at-path-id

Mongoose's findById method casts the id parameter to the type of the model's _id field so that it can properly query for the matching doc. This is an ObjectId but "11" is not a valid ObjectId so the cast fails.

如果客户端传递的是mongo ObjectId就不会报以上错误.例如以下访问方式:

http://192.168.0.165:9000/api/notices/41224d776a326fb40f000001 就不会报错.

{
"no": 1,
"obj": null
}

在正常情况下,客户端传递的id参数是从后台获取的ObjectId,但是为了严谨性现在做以下处理:

exports.show = function(req, res) {
var id = req.params.id; if (id.match(/^[0-9a-fA-F]{24}$/)) {
Notice.findById(id, function (err, notice) {
if(err) {
res.json({no:0,msg:'获取失败:'+err});
}else{
var result = {no:1};
result.obj=notice;
res.json(result);
}
});
}else{
res.json({no:0,msg:id+'不存在'});
} };

mongoose CastError: Cast to ObjectId failed for value的更多相关文章

  1. express+gulp构建项目(二)启动项目和主文件

    这一次整理的内容是项目主文件和如何启动项目. 启动项目 通过nodejs官网的例子https://nodejs.org/docs/latest-v4.x/doc/api/synopsis.html我们 ...

  2. 深入浅出mongoose

    深入浅出mongoose mongoose是nodeJS提供连接 mongodb的一个库. 此外还有mongoskin, mongodb(mongodb官方出品). 本人,还是比较青睐mongoose ...

  3. [转] 深入浅出mongoose-----包括mongoose基本所有操作,非常实用!!!!!

    深入浅出mongoose mongoose是nodeJS提供连接 mongodb的一个库. 此外还有mongoskin, mongodb(mongodb官方出品). 本人,还是比较青睐mongoose ...

  4. Node.js躬行记(4)——自建前端监控系统

    这套前端监控系统用到的技术栈是:React+MongoDB+Node.js+Koa2.将性能和错误量化.因为自己平时喜欢吃菠萝,所以就取名叫菠萝系统.其实在很早以前就有这个想法,当时已经实现了前端的参 ...

  5. mongoose手动生成ObjectId

    用mongoose驱动保存数据,如果_id没有定义,那么在save的时候,mongoose驱动会自己生成一个_id.那么如果需要手动生成可以用mongoose.Types.ObjectId()方法. ...

  6. mongoose和mongodb的几篇文章 (ObjectId,ref)

    http://mongoosejs.com/docs/populate.html http://stackoverflow.com/questions/6578178/node-js-mongoose ...

  7. mongoose ObjectId.toString()

    node中一般我们经常对id进行判断,有的id是string类型,有的是ObjectId(''),这时候就可以使用mongoose的toString方法,将它转换成string

  8. Mongoose 两个表关联查询aggregate 以及 Mongoose中获取ObjectId

    Mongoose 两个表关联查询aggregate 通常两个表关联查询的时候,是一种一对多的关系,比如订单与订单详情就是一对多的关系,一个订单下面有多个商品 数据模拟 首先我们先将数据模拟出来,先选择 ...

  9. Node.js Mongoose数据库连接失败 提示:Authentication failed

    mongoose.connect('mongodb://username:password@127.0.0.1:27017/qianxunkefu_db')换成mongoose.connect('mo ...

随机推荐

  1. opentesty--luasocket 安装

    转载请注明原文地址:http://www.cnblogs.com/dongxiao-yang/p/4878323.html luasocket安装过程中遇到不少坑,之前采用的是从公司以前服务器的里面找 ...

  2. dos 命令

    DOS远程桌面连接命令 mstsc /v: 192.168.1.250 /console cmd 运行 command删除文件 rd 文件名/S创建文件 MD 文件名 1. net user admi ...

  3. C语言判断系统数据大/小端存储方式

    小端存储:数据的低位部分,存储于存储器的低地址空间里. 大端存储:数据的低位部分,存储于存储器的高地址空间里. 首先,一般PC数据存储方式是小端存储. 基本实现思想是:将存储器中所存的数据按字节以地址 ...

  4. JVM运行数据区

    1.java虚拟机在运行的时候会把内存分为以下几个区域,如图:

  5. Appium测试时如何关联到Genymotion模拟器

    一.在Appium里点击左上角的Android Settings里填写模拟器的devicesName,并记得勾选和配置Application Path. (可以通过adb devices命令查询出当前 ...

  6. Android CountDownTimer 倒计时

    摘自:http://www.cnblogs.com/over140/archive/2011/12/20/2294220.html 继承关系 public abstract class CountDo ...

  7. floyd+动态规划 hdu-4571-Travel in time

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4571 题目大意: 有n个景点,每个点都有个游玩时间ci,游玩后得到的满意度si.给一个起点s和终点e ...

  8. 基于redis 内存数据库简单使用

    在ecplise中使用内存数据的客端户,前提要准备要下载两个jar包 commons-pool2-2.0.jar jedis-2.4.2.jar 前提准备做好了,那我们就开启redis的服务,打开一个 ...

  9. 关于C++构造函数的FAQ

    [1] 构造函数是用来干什么的? 构造函数构建类的对象,初始化类变量,分配资源(内存.文件.信号量.套接口等等) [2] List x; 和 List x();有什么不同? 前一个是定义List的一个 ...

  10. android requestWindowFeature使用详解

    requestWindowFeature可以设置的值有:          1.DEFAULT_FEATURES:系统默认状态,一般不需要指定          2.FEATURE_CONTEXT_M ...