Home > Blockchain >  MongooseError: Callback must be a function, got [object Object] with findOne mongoose
MongooseError: Callback must be a function, got [object Object] with findOne mongoose

Time:12-30

I have this code where I am finding a monitor in the database with these queries

        const monitorfind = await monitorschema.findOne({ Price: { $lte: Number(reqbody.price) } }, {Size: {$gte: Number(reqbody.size - 8)}}, {hz: {$gte: Number(reqbody.hz - 25)}}, {Resolution: {$gte: Number(reqbody.res)}}, {ResponseTime: {$lte: Number(reqbody.ms  4)}})

When I run the code, I get this error:

throw new MongooseError('Callback must be a function, got '   callback);
          ^

MongooseError: Callback must be a function, got [object Object]
    at Function.Model.$handleCallbackError (C:\Users\Sochum\Desktop\pickitly_web_main\node_modules\mongoose\lib\model.js:4924:11)
    at Function.findOne (C:\Users\Sochum\Desktop\pickitly_web_main\node_modules\mongoose\lib\model.js:2248:19)
    at C:\Users\Sochum\Desktop\pickitly_web_main\routes\monitors.js:23:49
    at Layer.handle [as handle_request] (C:\Users\Sochum\Desktop\pickitly_web_main\node_modules\express\lib\router\layer.js:95:5)
    at next (C:\Users\Sochum\Desktop\pickitly_web_main\node_modules\express\lib\router\route.js:137:13)
    at Route.dispatch (C:\Users\Sochum\Desktop\pickitly_web_main\node_modules\express\lib\router\route.js:112:3)
    at Layer.handle [as handle_request] (C:\Users\Sochum\Desktop\pickitly_web_main\node_modules\express\lib\router\layer.js:95:5)
    at C:\Users\Sochum\Desktop\pickitly_web_main\node_modules\express\lib\router\index.js:281:22
    at Function.process_params (C:\Users\Sochum\Desktop\pickitly_web_main\node_modules\express\lib\router\index.js:335:12)
    at next (C:\Users\Sochum\Desktop\pickitly_web_main\node_modules\express\lib\router\index.js:275:10)

How do I fix this?

CodePudding user response:

I think your reqbody is wrong pattern.right pattern is req.body.but you use any middleware function for passing data at time use code otherwise you can use req.body for your code.

try this

const conditions = {
    Price: { $lte: Number(reqbody.price) },
    Size: {$gte: Number(reqbody.size - 8)},
    hz: {$gte: Number(reqbody.hz - 25)},
    Resolution: {$gte: Number(reqbody.res)},
    ResponseTime: {$lte: Number(reqbody.ms  4)}
}

monitorschema.findOne(conditions, function (err, monitor) {

    console.log(monitor) //If matching any data it is show here 

});

CodePudding user response:

You need to chain exec() function after findOne. It is needed if we want to use async-await. Changing query to following should work:

const monitorfind = await monitorschema.findOne({
  Price: { $lte: Number(reqbody.price) },
  Size: {$gte: Number(reqbody.size - 8)},
  hz: {$gte: Number(reqbody.hz - 25)},
  Resolution: {$gte: Number(reqbody.res)},
  ResponseTime: {$lte: Number(reqbody.ms  4)}
}).exec()

Reference: https://masteringjs.io/tutorials/mongoose/promise

In case you are using older version of mongoose (<5), you will have to pass callback function as second param to findOne as suggested in first answer.

  • Related