node.js: ¿Las funciones de JavaScript dentro del mismo archivo no se ven entre sí?

CorePress2024-01-16  7

Así que tengo varias funciones definidas en fileA.js:

exports.doThis = async (a, b, c) => {
    return Promise.all(a.map(item => doThat(item, b, c) ) )
}

exports.doThat = async (item, b, c) => {
    console.log(`${b[1]} ${item} are good for ${c[0]`)
}

Importé doThis y doThat en fileB.js así:

const { doThis, doThat } = require('fileA')

const totallyDoingIt = async () => {
    let a = ['apples', 'bananas', 'peaches']
    let b = [1, 2, 3]
    let c = ['Tom', 'Ryan', 'Suzy']

    let startThingsOff = await doThis(a, b, c)
}

Espero que doThis vea doThat dentro de fileA.js pero al ejecutarlo aparece este error:

ReferenceError: doThat is not defined

Entonces, ¿cómo puedo hacer esto y aquello para ver que 2 manzanas son buenas para Tom?

2

exports.doThat está definido, doThat no.

- 3limin4t0r

19/03/2021 a las 18:34

La función asíncrona devuelve promesas de forma predeterminada, por lo que devolver la promesa desde la función asíncrona es redundante

- Shubham Dixit

19/03/2021 a las 18:36



------------------------------------

doThat no es un identificador independiente, es una propiedad de module.exports, así que haga referencia a eso:

return Promise.all(a.map(item => exports.doThat(item, b, c) ) )

1

¡Gracias señor! ¡Tom ahora está comiendo sus manzanas!

- rom

19/03/2021 a las 18:38



------------------------------------

Si desea hacer referencia a doThis y doThat solo con ese identificador, deberá definir las funciones como tales. Una forma de hacer esto es usar funciones con nombre regulares.

//  export name               local name
exports.doThis = async function doThis(a, b, c) {
    return Promise.all(a.map(item => doThat(item, b, c) ) )
};

exports.doThat = async function doThat(item, b, c) {
    console.log(`${b[1]} ${item} are good for ${c[0]}`);
};

Otra opción es definir primero la función y luego exportarla.

// define
const doThis = async (...) => { ... };
const doThat = async (...) => { ... };

// export
module.exports = { doThis, doThat };
// or
Object.assign(exports, { doThis, doThat });
// or
exports.doThis = doThis;
exports.doThat = doThat;
// etc.

Su guía para un futuro mejor - libreflare
Su guía para un futuro mejor - libreflare