Yoni hodefi
Yoni hodefi

Reputation: 113

Argument passed in must be a single String of 12 bytes or a string of 24 hex characters, Mongoose ObjectId err

I actually searched a ton and I saw a ton of mentions of my problem here but none of the things I tried helped me fix the issue i'm having.

I have a Room Scheme that looks like this:

const ObjectId = mongoose.Schema.ObjectId;
const roomSchema = mongoose.Schema({
users: [{
    type: ObjectId,
    ref: 'User'
}],
messages: [{
    type: ObjectId,
    ref: 'Message',
}],
post: {
    type: ObjectId,
    ref: 'Post'
  }
});

As you can see I have an array of users with ref to another schema Users

I'm trying to query all the Rooms that has a User ObjectId in it (search ObjectId in an array).

while I can easily get this with querying mongo from cmd using this:

db.users.find({users:ObjectId('THE_OBJECT_ID')});

when I try to get the same while using mongoose it fails with:

Error: Argument passed in must be a single String of 12 bytes or a string of 24 hex characters

Here is how my route and find looks like:

  app.route('/rooms/list/:user_id')
    .get((req, res) => {
        var query = { users: "USER_ID" };
        Room.find(query ).populate('messages').then((data) => {
            res.status(200).json(data);
        }).catch((err) => {
            console.log(err);
        });
     })

I tried to create type of object ID and use it but it still doesn't work.

var mongoose = require('mongoose'),
userId = 'THE_USER_ID';
var id = mongoose.Types.ObjectId(userId);

and than

Rooms.find({'users': id });

but it still doesn't work.

I also tried altering my query search using $in, $elemmatch it worked on cmd but failed when querying using mongoose.

Any help would be appreciated.

Upvotes: 1

Views: 10158

Answers (1)

whoami - fakeFaceTrueSoul
whoami - fakeFaceTrueSoul

Reputation: 17925

Issue :

If you check this :

var query = { users: "USER_ID" };

(Or)

userId = 'THE_USER_ID';
var id = mongoose.Types.ObjectId(userId);

What are you trying to do here ? You are passing in string USER_ID or THE_USER_ID as input and trying to convert it to type of ObjectId(). But string inside ObjectId() has certain restrictions which is why mongoose is failing to convert passed in string value to ObjectId() and getting error'd out.

Try this code :

Code :

const mongoose = require('mongoose');


app.route('/rooms/list/:user_id')
    .get((req, res) => {
        var query = { users: mongoose.Types.ObjectId(req.params.user_id) };
        Room.find(query).populate('messages').then((data) => {
            res.status(200).json(data);
        }).catch((err) => {
            console.log(err);
        });
    })

Your input should be value of user_id (Which will be string) - Convert it to ObjectId() and then query DB. So value of user_id should be a string that obeys ObjectId()'s restrictions, You can take string from one of existing doc's ObjectId() & test your get api.

Upvotes: 0

Related Questions