Nas versões mais atuais do mongoose na publicação desta resposta (7.1.0), a maioria dos métodos estão sendo convertidos de Callback, para Promises. Por exemplo, o método findByIdAndUpdate
já não funciona mais como callback, ao invéz disso, pra pegar o registro atualizado (caso encontre) podemos lançar mão da sintaxe async
await
ou then
, observem:
static async update(req, res) {
try {
const { id } = req.params;
const newBook = await book.findByIdAndUpdate(id, req.body, {
new: true
});
res.status(200).json(newBook);
} catch (error) {
res.status(500).json({ error: error });
}
}
Algo que não entendi ainda e estou tentando entender é, por que, que passadado um ID inexistente o erro retornado é de erro de casting de dado e não um erro do tipo not found por exemplo? O retorno é esse:
{
"error": {
"stringValue": "\"64553878012cfe4c92d0868\"",
"valueType": "string",
"kind": "ObjectId",
"value": "64553878012cfe4c92d0868",
"path": "_id",
"reason": {},
"name": "CastError",
"message": "Cast to ObjectId failed for value \"64553878012cfe4c92d0868\" (type string) at path \"_id\" for model \"books\""
}
}
Se alguém souber porque comenta aqui.
[UPDATE-1]
Visto que aparentemente todos os métodos findX
retornam um erro da classe CastError
do mongoose, eu fiz uma condição pra modificar a mensagem de retorno, como aqui:
// [...] outros imports
import { Error } from 'mongoose';
static async get(req, res) {
try {
const { id } = req.params;
const book = await BookModel.findById(id);
return res.status(200).json(book);
} catch (error) {
if (error instanceof Error.CastError) {
return res.status(400).json({ error: 'book not found' });
}
return res.status(500).json(error);
}
}
Porém, isso não faz muito sentido, visto que aparentemente o mongoose tem uma classe específica para tratar erro de registros não encontrados.
Notem aqui no arquivo error.d.ts que pode ser encontrado no diretório node_modules/mongoose/types/error.d.ts
Vejam, eles especificam uma classe DocumentNotFoundError (Que acho que serviria para esse caso).
Porém olhando a documentação oficial sobre DocumentNotFoundError, noto que o método só é aplicado ao método save(), o que novamente, não entendi...
Me ajudem aí