Estoy transfiriendo un servidor web de python a node.js y una de las capacidades que debe tener ese servidor es recibir un POST que contiene información sobre una consulta de MongoDB y enviar el resultado de la consulta a la página web. La consulta puede contener o no un filtro, una proyección, un límite y una ordenación. En python podemos hacerlo así:
(En los ejemplos a continuación, command_name es igual a 'buscar')
command = getattr(collection, command_name) cmd_filter = loads(filter_str) if filter_str else None projection = loads(projection_str) if projection_str else None limit = loads(limit_str) if limit_str else 0 sort = [(elt['key'], elt['order']) for elt in loads(sort_str)] if sort_str else None response = command(filter=cmd_filter, projection=projection, sort=sort, limit=limit)Pero tengo problemas para encontrar una manera de hacerlo en node.js, he probado cosas como esta:
command_name = req.body['command'] command = collection[command_name] command = filter_str != undefined ? collection[command_name](JSON.parse(filter_str)) : collection[command_name] command = projection_str != undefined ? command['project'](JSON.parse(projection_str)) : command command = sort_str != undefined ? command['sort'](JSON.parse(sort_str)) : command command = limit_str != undefined ? command['limit'](JSON.parse(limit_str)) : command response = command.toArray(function(err, result) { if (err) throw err console.log(result) }) Pero no funciona. Obtengo un MongoError: Can't canonicalize query: BadValue bad order array [2]
Su código que no funciona es el menor de sus problemas aquí. No sé si te das cuenta, pero un usuario puede ejecutar cualquier comando en la base de datos con tu API. No sé si existe ese nombre, pero tiene una vulnerabilidad de inyección de Mongo. Nunca antes había visto algo así, ejecutar explícitamente métodos aleatorios proporcionados por el usuario con datos aleatorios en una base de datos en vivo.
Busque la paginación, clasificación, etc. de Mongoose para las API REST en Node y encontrará mucha información sobre cómo hacerlo correctamente.
Hay algunos módulos que pueden ayudarte con eso: