Antes de colocar a esta pregunta, me sentí un poco intimidado porque consigo la mala reacción de mis preguntas no están muy detallados. He intentado hacerlo lo más detallado que pude.
Objetivo
He subido con éxito imágenes a Cloudinary, pero mi objetivo no es guardarlos en el servidor. Es para enviarlos a través de la memoria de la nube Cloudinary. Así que estoy usando el paquete multer a enviarlo a través de la memoria. Entonces estoy usando el paquete de afilado para transformarla, y finalmente es el que dispone la ruta updateMe.
¿Qué he intentado? He tratado de enviarlos a través de buffer usando el paquete agudo. Una vez que se cambia el tamaño, a continuación, enviar a través de amortiguamiento, pero tal vez estoy haciendo las configuraciones erróneas.
He comentado en ambos sentidos He intentado enviar datos entre los dos middleware.
Ruta
router.patch(
/updateMe,
authController.protect,
userController.uploadUserPhoto,
userController.resizeUserPhoto,
userController.updateMe
);
usuario del controlador
//using the multer package
const multerStorage = multer.memoryStorage();
const multerFilter = (req, file, cb) => {
if (file.mimetype.startsWith(image)) {
cb(null, true);
} else {
cb(new AppError(Not an image! Please upload only images., 400), false);
}
};
const upload = multer({
storage: multerStorage,
fileFilter: multerFilter
});
exports.uploadUserPhoto = upload.single(photo);
//using the sharp package to resize images
exports.resizeUserPhoto = async (req, res, next) => {
if (!req.file) return next();
req.file.filename = `user-${req.user.id}-${Date.now()}.jpeg`;
sharp(req.file.buffer)
.resize(200, 200)
.toFormat(jpeg)
.jpeg({ quality: 90 })
// .toBuffer({ resolveWithObject: true }); //this is commented because I had no result using them
// .toFile() // This one will save to local path to server
next();
};
Hasta este punto, si console.log (req.file) me sale el tampón dentro del objeto, pero parece no estar afectada por el paquete agudo, lo que me da alguna pista que lo estoy usando indebidamente. He tratado allí Docs, pero no pude encontrar nada que se relacione que pude entender (tal vez la respuesta es no, pero no puedo entenderlo).
// ruta UpdateMe
exports.updateMe = catchAsync(async (req, res, next) => {
// validation functions go here
//**here I have even tried cloudinary.uploader.upload(req.file.buffer)... and nothing happens**
if (req.file) {
const result = await cloudinary.uploader.upload(req.file.path, {
use_filename: true,
folder: `${req.user.id}/profile/`
});
filteredBody.photo = result.url;
}
}
¿Alguna sugerencia sobre cómo hacer esto con éxito?