Tratando de exportar funciones sin éxito con JavaScript, Nodo. js

Estoy tratando de aprender Node.js y tengo una buena aplicación ahora, pero quería implementar una biblioteca (venom-bot) para enviar algunos mensajes de texto. Mi problema es que estoy teniendo problemas para intentar usar funciones fuera del archivo primario. Aquí está mi código:

// Dependencies
const server = require("./lib/server")
const venom = require("venom-bot")

// Declare the app
const app = {}

// Init function
app.init = () => {
    // Start the server
    server.init()
}

// Init venom-bot
venom.create().then((client) => start(client))

// A function to test if I can send the message
async function testing(msg) {
    await msg.sendText(...some code here...)
}

function start(client) {
    app.msg = client

    // Here, if I pass app.msg as an argument, works
    // My problem is that I can't use app.msg outside of here,
    // even with the module.exports down there
    // (I'm trying to use it on a helpers.js file).
    testing(app.msg)

    // Execute the application
    app.init()
}

// Export the app
module.exports = app

En el helpers.js archivo Lo estoy requiriendo de esta manera:

// Dependencies
const app = require("./index.js")

// A function to test
async function sendMsg(msg) {
    await msg.sendText(...some code here...)
}

helpers.send = () => {
    sendMsg(app.msg)
}

module.exports = helpers

Siempre helpers.send se invoca, debe utilizar correctamente la función asinc justo encima de la helpers.send pasando app.msg como argumento, al menos creo que debería. ¿Qué me estoy perdiendo aquí?

El error que tengo es:

(nodo:18148) UnhandledPromiseRejection Advertencia: Tipo Error: No se puede leer la propiedad 'sendText' de undefinido

A propósito de la prueba, estoy tratando de llamar a ese ayudante cuando recibo una solicitud para obtener una ruta especificada.

Pregunta hecha hace 3 años, 5 meses, 0 días - Por codemaestro


2 Respuestas:

  • El problema que estás experimentando es que estás intentando acceder a la propiedad sendText de un objeto que es undefined, lo cual provoca el error que estás viendo. Esto ocurre porque estás intentando llamar a la función sendMsg en tu archivo helpers.js sin asegurarte de que app.msg se haya inicializado correctamente en tu archivo principal index.js.

    Para solucionar este problema, te recomendaría hacer lo siguiente:

    • En tu archivo `index.js`, asegúrate de que `app.msg` se haya inicializado antes de llamar a la función `sendMsg`. Una forma de hacerlo es esperar a que la promesa se resuelva antes de llamar a `testing`.

    Por ejemplo, podrías modificar el código así:

    javascript
    venom.create().then((client) => {
        start(client)
        app.msg = client
    })
    
    • En tu archivo `helpers.js`, asegúrate de que `app.msg` no sea `undefined` antes de llamar a `sendMsg`. Puedes verificar esto de la siguiente manera:
    javascript
    const app = require("./index.js")
    
    async function sendMsg(msg) {
        if (msg) {
            await msg.sendText(...some code here...)
        } else {
            console.log("app.msg is undefined")
        }
    }
    
    const helpers = {}
    
    helpers.send = () => {
        sendMsg(app.msg)
    }
    
    module.exports = helpers
    

    Con estas modificaciones, deberías poder resolver el error que estás experimentando y asegurarte de que app.msg se inicialice correctamente antes de intentar usarlo en sendMsg en tu archivo helpers.js.

    Respondida el Dec 17, 2020 a las 16:24 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • El problema es que estás intentando acceder a app.msg desde el archivo helpers.js, pero app.msg solo está definido dentro de la función start en el archivo index.js.

    Para solucionar esto, puedes exportar app.msg desde el archivo index.js y luego importarlo en el archivo helpers.js. Aquí tienes cómo hacerlo:

    index.js:

    javascript
    // ... código existente
    
    // Exporta app.msg
    module.exports = {
      app,
      msg: app.msg,
    };
    

    helpers.js:

    javascript
    // ... código existente
    
    // Importa app.msg desde index.js
    const { msg } = require("./index.js");
    
    // ... código existente
    
    // Usa msg en la función sendMsg
    async function sendMsg(msg) {
      await msg.sendText(...some code here...);
    }
    

    Ahora, puedes usar msg en el archivo helpers.js sin problemas.

    Otra opción:

    Otra forma de resolver este problema es pasar app.msg como argumento a la función sendMsg cuando la llamas desde el archivo helpers.js. Aquí tienes cómo hacerlo:

    index.js:

    javascript
    // ... código existente
    
    // ... código existente
    
    // Ejecuta la aplicación y pasa app.msg como argumento a sendMsg
    app.init(() => {
      sendMsg(app.msg);
    });
    

    helpers.js:

    javascript
    // ... código existente
    
    // Define la función sendMsg con el argumento msg
    async function sendMsg(msg) {
      await msg.sendText(...some code here...);
    }
    

    Espero que esto solucione tu problema. Avísame si tienes alguna otra pregunta.

    Respondida el Dec 17, 2020 a las 16:33 - por Gemini

    Votos positivos: 0 | Votos negativos: 0