Soy nuevo en Express y Mongoose. Actualmente estoy trabajando en mi primer proyecto, que no es un tutorial, y me he encontrado con un problema.
Tengo varias rutas, están definidas en index.js así:
app.use('/api/client',require('./routes/client')); app.use('/api/host',require('./routes/host'));En las rutas, hay varios verbos que funcionan, como PUT y POST. Aquí está la ruta problemática (estoy tratando de hacer más de lo que se presenta aquí, pero lo que se presenta aquí no funciona tan bien):
router.get('/ama/:id', function (req, res, next) { Ama.findById(req.params.id).then(function(Ama){ res.send(Ama); }); });Esto debería funcionar, ¿verdad? Debería devolver el documento en la base de datos, con esa identificación. Y he comprobado si el documento existe, probablemente unas 100 veces. Ahora, si simplifico mucho la ruta, eliminando la identificación y doy una respuesta simple, la ruta funciona:
router.get('/ama', function (req, res, next) { res.send({type:"GET"}); });Es tan extraño, que tan pronto como agrego el parámetro, obtengo un:
<pre>Cannot GET /api/host/ama</pre>en Cartero.
¿Algunas ideas? Mongod se está ejecutando, mis otras rutas están funcionando.
Parece que estás intentando recuperar esta URL:
/api/host/ama?id=SOMEIDSin embargo, tiene una ruta declarada para las URL que se ven así:
/api/host/ama/SOMEID En otras palabras, la identificación es parte de la ruta de la URL y no se pasa como un parámetro de cadena de consulta (eso es lo que significa /:id : es un marcador de posición para una parte de la URL que la ruta debe coincidir).
Entonces, cambie la URL de solicitud agregando la identificación a la ruta ( /api/host/ama/58e395a8c6aaca2560089ce7 ), o reescriba su controlador de ruta a algo como esto:
router.get('/ama', function (req, res, next) { Ama.findById(req.query.id).then(function(Ama){ res.send(Ama); }); });Sin embargo, recomendaría usar el primero (haciendo que la identificación sea parte de la URL).
Hay dos problemas aquí:
router.get('/ama/:id', function (req, res, next) { Ama.findById(req.params.id).then(function(Ama){ res.send(Ama); }) res.send(req.params.id)*/ }); En primer lugar, res.send(req.params.id) se ejecutará antes que res.send(Ama); y probablemente enviará la respuesta completa. Te falta la llamada al método .exec() (ver la respuesta de Cédric De Dycker para más detalles). El res.send() solo se puede usar de manera confiable una vez. Tal vez quieras res.write() en su lugar si quieres escribir varias cosas. Además, no maneja el rechazo de la promesa, por lo que no maneja los errores de la base de datos. Para saber por qué siempre debe manejar los rechazos de promesas, consulte esta respuesta: ¿Debería abstenerme de manejar el rechazo de promesas de forma asíncrona?
El parámetro debería funcionar bien, pero parece que no agregó .exec a su consulta
Ama.findById(req.params.id).exec().then(function(Ama){ res.send(Ama); })