Hi everyone, I’d like to know why I can’t get the result of the javascript action it’s always either “null” or “undefined” I’ve tested 50 possible codes it never works…
In the code I use the element qr code reader and I try to screenshot an image of the preview and to have a link of this image in a variable
// Fonction pour traiter l’image et retourner une promesse
function processImage() {
return new Promise((resolve, reject) => {
const qrCodeReaderElement = wwLib.getFrontDocument().getElementById(qrCodeReaderCameraID);
if (qrCodeReaderElement) {
qrCodeReaderElement.addEventListener('loadeddata', function() {
const canvas = document.createElement('canvas');
canvas.width = qrCodeReaderElement.videoWidth;
canvas.height = qrCodeReaderElement.videoHeight;
const ctx = canvas.getContext('2d');
ctx.drawImage(qrCodeReaderElement, 0, 0, canvas.width, canvas.height);
const imageData = canvas.toDataURL('image/jpeg');
// Ici, utilisez la méthode appropriée pour définir la variable globale dans WeWeb
// Remplacez la ligne suivante par la méthode correcte selon la documentation WeWeb
// Exemple : setGlobalVariable(qrImageURLVarName, imageData);
resolve(imageData);
});
} else {
console.error('Élément QR Code Reader non trouvé avec l\'ID:', qrCodeReaderCameraID);
reject('Élément QR Code Reader non trouvé');
}
});
}
// Appeler la fonction et traiter la valeur de retour
processImage().then(imageData => {
// imageData est disponible ici
console.log(‘URL de l'image capturée:’, imageData);
// Vous pouvez utiliser imageData ici
// Par exemple :
// displayImage(imageData);
}).catch(error => {
// Gérer les erreurs ici
console.error(‘Erreur lors du traitement de l'image:’, error);
});
// Toute tentative d’accéder à imageData en dehors de la fonction then() donnera undefined
// Accéder aux variables globales
const qrImageURLVarName = variables['a9ef5f76-3892-4011-971e-1ea846708055'];
const qrCodeReaderCameraID = variables['78180aed-7ffb-4da1-8187-61d4f3c64968-cameras']?.[0];
// Fonction pour traiter l’image et retourner une promesse
function processImage() {
return new Promise((resolve, reject) => {
const qrCodeReaderElement = wwLib.getFrontDocument().getElementById(qrCodeReaderCameraID);
if (qrCodeReaderElement) {
qrCodeReaderElement.addEventListener('loadeddata', function() {
const canvas = document.createElement('canvas');
canvas.width = qrCodeReaderElement.videoWidth;
canvas.height = qrCodeReaderElement.videoHeight;
const ctx = canvas.getContext('2d');
ctx.drawImage(qrCodeReaderElement, 0, 0, canvas.width, canvas.height);
const imageData = canvas.toDataURL('image/jpeg');
// Ici, utilisez la méthode appropriée pour définir la variable globale dans WeWeb
// Remplacez la ligne suivante par la méthode correcte selon la documentation WeWeb
// Exemple : setGlobalVariable(qrImageURLVarName, imageData);
resolve(imageData);
});
} else {
console.error('Élément QR Code Reader non trouvé avec l\'ID:', qrCodeReaderCameraID);
reject('Élément QR Code Reader non trouvé');
}
});
}
// Appeler la fonction et traiter la valeur de retour
processImage().then(imageData => {
// Retourner imageData pour qu'il soit disponible dans la variable de résultat de l'action
return imageData;
}).catch(error => {
// Gérer les erreurs ici
console.error('Erreur lors du traitement de l\'image:', error);
});
// Toute tentative d’accéder à imageData en dehors de la fonction then() donnera undefined
Instead of the processImage.then() syntax. That will more clearly send the promise and its result back to the workflow. The workflow is already in an asynchronous context so that should work well.
If that doesn’t get you there, I’d use console.log(imageData) inside your processImage function to see what it actually generates and that we are good with that that looks like. You can retrieve the result of the console.log in devtools.
We work on this kind of lowcode problem all the time as part of our focus on the hardest 5% in our daily State Change office hours.
const qrImageURLVarName = variables[/* qrImageURL */'a9ef5f76-3892-4011-971e-1ea846708055'];
const qrCodeReaderCameraID = variables[/* QR Code Reader */'78180aed-7ffb-4da1-8187-61d4f3c64968-cameras'];
// Fonction pour traiter l’image et retourner une promesse
function processImage() {
return new Promise((resolve, reject) => {
const qrCodeReaderElement = wwLib.getFrontDocument().getElementById(qrCodeReaderCameraID);
if (qrCodeReaderElement) {
qrCodeReaderElement.addEventListener('loadeddata', function() {
const canvas = document.createElement('canvas');
canvas.width = qrCodeReaderElement.videoWidth;
canvas.height = qrCodeReaderElement.videoHeight;
const ctx = canvas.getContext('2d');
ctx.drawImage(qrCodeReaderElement, 0, 0, canvas.width, canvas.height);
const imageData = canvas.toDataURL('image/jpeg');
// Ajout d'un console.log pour le débogage
console.log(imageData);
// Remplacez cette ligne par la méthode correcte selon la documentation WeWeb
// setGlobalVariable(qrImageURLVarName, imageData);
resolve(imageData);
});
} else {
console.error('Élément QR Code Reader non trouvé avec l\'ID:', qrCodeReaderCameraID);
reject('Élément QR Code Reader non trouvé');
}
});
}
// Appeler la fonction et traiter la valeur de retour
processImage().then(imageData => {
// Retourner imageData pour qu'il soit disponible dans la variable de résultat de l'action
return imageData;
}).catch(error => {
// Gérer les erreurs ici
console.error('Erreur lors du traitement de l\'image:', error);
});
// Toute tentative d’accéder à imageData en dehors de la fonction then() donnera undefined```
![image|350x358](upload://zXMSSW8mB08JPkrRlE0qxraybp0.png)
How can I get details of errors if they don't appear in the logs?
![image|418x246](upload://v2qsZ2osekuoTh4fA33qFi6Zvgo.png)
Your function has to throw error instead of catching it if you want it to show up inside the Editor logs.
Could you try to replace
processImage().then(imageData => {
// Retourner imageData pour qu'il soit disponible dans la variable de résultat de l'action
return imageData;
}).catch(error => {
// Gérer les erreurs ici
console.error('Erreur lors du traitement de l\'image:', error);
});
with
return await processImage()
Also do you have any logs in the browser console ?
I dont think it’s the ID of the element. It’s the ID of the camera. Its not the same thing.
Your code is trying to retrieve the HTML element associated with a given ID. The ID of the element si what you type inside the id input on the settings of your element.
Where “reader” is the id you can put on the html attribute of your qrcode element, from the settings.
I’m just helping you with your code, I don’t know if it will do what you expect. Be aware there is already a canvas element so maybe you want to target it directly too instead of creating another one. To select it you can do something similar:
Thank you, it finally works!! I am putting the code below for those who are interested (replace ‘camerarayane’ with the id of your element to screenshot). However, do you know how to convert the base64 URL into a .png URL or another format?
const qrImageURLVarName = 'a9ef5f76-3892-4011-971e-1ea846708055'; // Replace with the actual variable name as needed
// Function to process the image and return a promise
function processImage() {
return new Promise((resolve, reject) => {
// Updated querySelector to target the canvas within the element with the ID 'camerarayane'
const qrCodeReaderElement = wwLib.getFrontDocument().querySelector('#camerarayane > canvas');
if (qrCodeReaderElement) {
// Assuming the canvas already has the video drawn onto it
const imageData = qrCodeReaderElement.toDataURL('image/jpeg');
// Use the appropriate method to set the global variable in WeWeb
// Replace the following line with the correct method according to WeWeb documentation
// Example: setGlobalVariable(qrImageURLVarName, imageData);
resolve(imageData);
} else {
console.error('QR Code Reader canvas element not found within the #camerarayane element');
reject('QR Code Reader canvas element not found');
}
});
}
// Invoke the function and handle the return value
return processImage().then(imageData => {
// Return imageData to be available in the action result variable
return imageData;
}).catch(error => {
// Handle errors here
console.error('Error processing the image:', error);
});
I’m not sure to understand what you mean by converting into a .png URL. What you get is already an url you can use and paste inside the image element to display it for example.