Estoy escribiendo un código en NodeJs usando jimp y qrcode-reader. Esas dependencias funcionan bien. El problema radica cuando exporto el código a un módulo. Y supuestamente, debería devolver un valor. Esta es una función de flecha que devuelve la URL del código QR. Sin embargo, si uso "console.log", puedo ver que funciona. Pero cuando uso el módulo, devuelve indefinido. Tal vez me estoy perdiendo algo realmente simple.
Aquí está el código del módulo:
const Jimp = require('jimp') const fs = require('fs') const QrCode = require('qrcode-reader') const scanQR = (source) => { const buffer = fs.readFileSync(source) Jimp.read(buffer, (err, image) => { try { const qr = new QrCode() qr.callback = (error, value) => { try { console.log(value.result) return value.result } catch(error) { console.error(error) } } qr.decode(image.bitmap) } catch (error) { console.error(error) } }) } module.exports = scanQRAquí está el módulo importado:
const scanQR = require('./utils/scanQR') const qr_code_screenshot = `${__dirname}/assets/images/qrcode-test.png` const result = scanQR(qr_code_screenshot) console.log(result) Aquí está el resultado en la consola: 
Gracias por adelantado.
Su función scanQR no devuelve nada: y por lo tanto, cuando asigna su valor de retorno, obtiene undefined . Eso se espera . Los problemas provienen de que intenta devolver algo dentro de una devolución de llamada que solo se activa de forma asíncrona.
Para resolver este problema, deberá envolver la lógica interna en una promesa (que se devuelve). Luego, puede resolver/rechazar la promesa en función de si el código se ejecutó correctamente o arrojó un error:
const scanQR = (source) => { // Wrap all logic inside a promise, which you return return new Promise((resolve, reject) => { const buffer = fs.readFileSync(source); Jimp.read(buffer, (err, image) => { try { const qr = new QrCode(); qr.callback = (error, value) => { try { // Resolve promise here resolve(value.result); } catch(error) { // Reject promise reject(error); } } qr.decode(image.bitmap); } catch (error) { reject(error); } }); }); } Al consumir el módulo, deberá usar .then() :
const scanQR = require('./utils/scanQR'); const qr_code_screenshot = `${__dirname}/assets/images/qrcode-test.png`; // `scanQR` returns a promise and you will need to use `.then()` scanQR(qr_code_screenshot).then(data => console.log(data));...o use async/await: esta es una de las muchas maneras de hacerlo:
const scanQR = require('./utils/scanQR'); async function scan(image) { const result = await scanQR(image); console.log(result); } scan(`${__dirname}/assets/images/qrcode-test.png`);