Return 来自节点中外部调用的 fs.Readfile() 的值

Return value from externally called fs.Readfile() in node

我正在尝试从函数中获取一个值 returned,在该函数中我使用 fs.readFile/writeFile 在 Node.

中读取和写入文件

在我的主 server.js 文件中,收到一个请求,然后我想从另一个名为 sendEmail.js:

的文件发送一封电子邮件
const fs = require('fs')
const sendMail = require('./sendEmail')

async function sendAnEmail() {
    let resultOfSend = await sendMail.sendEmail()
    resultOfSend.then((result)=>{
      // return the result
    }        
}

sendAnEmail();

在 sendEmail 中,我首先读取一个文件以获取要发送到的电子邮件, 然后写入第二个文件 然后,如果一切正常,我会发送一封电子邮件(从一个单独的函数):

async function sendEmail() {
    // Check if user exists
    fs.readFile('./file.json', (err, data) => {
        if(err) {
            throw error
        }
        else {
            let users = JSON.parse(data)
            let dataToWrite = JSON.stringify(users)

            fs.writeFile('./file2.json', dataToWrite, (err) => {
                if(err) {
                    console.error(err)
                    throw error
                }
                else {
                    return generateEmail(users)
                        .then((info) => {
                           return info
                        })
                        .catch(console.log('err'))
                }
            })
        }
    })
}

async function generateEmail(user) {
        let msgText = 'hello world'

        // Set the mail options
        const mailOptions = {
           ...
        }
        
        // Send the mail
    let info = await transporter.sendMail(mailOptions)
    return info
}

module.exports = {sendEmail}

我无法获得 resultOfSend 变量的值。一直返回未定义,我想是因为承诺还没有实现。

如何从 sendEmail 函数返回 return 的值返回调用它的 server.js 文件?

您在 sendEmail 中使用了 await 和 async 但没有 returning 任何 Promise (因此 sendEmail 函数没有 return 任何东西这就是你得到 undefined 的原因)。 尽管如此,即使您使用了 await.

,您仍试图调用 .then() 的响应

所以你应该:

  1. return sendEmail 函数中的 Promise。
  2. 决定你想如何处理它,如果你使用 async-await 然后不要使用 .then() 并且只分析变量,反之亦然。
  3. generateEmail()函数也应该returnPromise.

例如:

async function sendEmail() {
return new Promise((resolve, reject) => {
    // Check if user exists
    fs.readFile('./file.json', (err, data) => {
        if(err) {
            reject()
        }
        else {
            let users = JSON.parse(data)
            let dataToWrite = JSON.stringify(users)

            fs.writeFile('./file2.json', dataToWrite, (err) => {
                if(err) {
                    console.error(err)
                    reject()
                }
                else {
                    generateEmail(users)
                        .then((info) => {
                            resolve(info)
                        })
                        .catch(
                            console.log('err')
                            reject()
                        )
                }
            })
        }
    })
})
}