2017-02-17 54 views
0

使用Node/Express + Mongo制作一个API。为什么猫鼬findById返回一个错误,如果没有发现ID

我正在写一些单元测试,我发现,如果我试图让/profile/1_id=1(我让蒙戈把ID默认情况下,所以我不能有_id=1)我得到这个错误

MongooseError: Cast to ObjectId failed for value "1" at path "_id"

我以为我会有一个空的对象用户。

function getProfile(req, res) { 
    const userId = req.params.userId 

    User.findById(userId, "-password", (err, user) => { 
    if (err) { 
     console.log(err); 
     res.status(400) 
     res.json({ 
     success: false, 
     err 
     }) 
     res.end() 
     return 
    } 

    if (!user) { 
     res.status(404) 
     res.json({ 
     success: false, 
     message: `Cannot find an User with the userId: ${userId}` 
     }) 
     res.end() 
     return 
    } 

    res.json({ 
     success: true, 
     user: user 
    }) 
    res.end() 
    return 
    }) 
} 

我的测试:

describe('Test /profile route',() => { 

    it('shouldn\'t find Joe Doe\'s profile with a wrong ID\n', (done) => { 
     chai.request(server) 
     .get(`/profile/1`) 
     .end((err, res) => { 
     expect(res).to.have.status(404) 
     done() 
     }) 
    }) 

我想我有一个错误404(第二个如果,我知道这是不正确的代码错误,只是我看到一个快速的方法在我的测试去),但我得到了400 - >意思是一个错误是回报。

我阅读猫鼬的文档,我真的没有看到他们用不同的方法解释返回值。

+0

正在达到哪个部分你的代码抛出的错误? – brandonscript

+0

在我看来,问题是类型 - 看起来像是一个Int,但期望一个ObjectId。你在使用TypeScript吗? – brandonscript

+0

我忘了把我的测试代码抱歉。不,我没有使用TypeScript。 (我听说过它,但我仍然没有去读它的说实话) – Ragnar

回答

1

问题是'1'不是有效的猫鼬对象id。因此它试图比较不同的类型。

尝试强制转换为对象ID如下:

userId = mongoose.Types.ObjectId(userId) 

,然后运行查询

User.findById(userId, "-password", (err, user) => { .... }); 
+0

好吧,这是一个类型的问题。所以如果我有一个POST请求与“userId”:“12345”我必须把它转换为ObjectId? – Ragnar

+1

如果它的类型不是ObjectId,那么是的,你需要投它。或者至少,根据我的经验,我一直不得不这样做。 –