Quiero escribir una función que devuelva un booleano que indique si una imagen con el public_id especificado ya existe en mi espacio de Cloudinary.
Puedo registrar el resultado en la consola con el siguiente código:
function isUploaded(public_id) { cloudinary.api.resource(public_id, function(response){ console.log(response.hasOwnProperty('public_id')); }); }; isUploaded('test'); Sin embargo, quiero pasar el resultado, el booleano, a otra función. El uso de una declaración de devolución da como resultado que se registre { state: 'pending' } :
function isUploaded(public_id) { return cloudinary.api.resource(public_id, function(response){ return response.hasOwnProperty('public_id'); }); }; console.log(isUploaded('test'));Esto tiene algo que ver con JavaScript Promises. Sin embargo, parece que no puedo reestructurar mi código para que funcione. Cualquier ayuda sería muy apreciada.
El problema es que cloudinary.api.resource se ejecuta de forma asíncrona (por eso requiere una función de devolución de llamada).
Puede hacer que su función isUploaded devuelva una Promise que se resuelve una vez que se llama a la devolución de llamada.
var cloudinary = require('cloudinary'); function isUploaded(public_id) { return new Promise(function (resolve, reject) { cloudinary.api.resource(public_id, function(response) { var isUploaded = response.hasOwnProperty('public_id'); resolve(isUploaded); }); }); }; isUploaded('test') .then(function (result) { console.log(result); })Tenga en cuenta que api.resource() tiene una tasa limitada (parte de la API de administración ), por lo que esta no es una solución "escalable".
Puede realizar una solicitud HEAD y obtener el statusCode de estado de la respuesta: 200 significa que el recurso existe en su cuenta, 404 de lo contrario.
Por ejemplo -
var http = require('http') var options = {method: 'HEAD', host:'res.cloudinary.com',path:'/<cloud_name>/image/upload/<yourimage.jpg>'} var req = http.request(options, function(res) {console.log(res.statusCode);}); req.end();