【问题标题】:async method chaining in express.jsexpress.js 中的异步方法链接
【发布时间】:2021-09-15 18:14:17
【问题描述】:

我无法在 expressjs 中进行异步链接。第一个方法(getUser)工作正常并正确返回值。第二种方法(sendmail)工作正常(发送邮件)但它总是返回undefinedmailResponse app.js 中的值总是返回 undefined。

如果它没有运行,则该方法的内部也不应该工作,但除了return 语句之外一切正常。哪里错了?

这是我的 axios 方法;

const axios = require('axios');

const getUser = async (id) => {
    try {
        const response = await axios.get('xxxxxx', {
          params: {
            id: id
          }
        });
        return response.data[0];
    } catch (err) {
        console.log(err);
    }
}

module.exports = getUser;

发送邮件方法;

var nodemailer = require('nodemailer');
var transporter = nodemailer.createTransport({
  service: 'gmail',
  auth: {
    user: 'youremail@gmail.com',
    pass: 'yourpassword'
  }
});

var mailOptions = {
  from: 'youremail@gmail.com',
  to: 'myfriend@yahoo.com',
  subject: 'Sending Email using Node.js',
  text: 'That was easy!'
};

const sendMail = async (data) => {
    email.send(mailOptions).then(() =>{         
        console.log("email has been sent!");
        return true;
      }).catch((err) => {
        console.log(err)
        return false;
      });
}

module.exports = sendMail;

app.js

const express = require('express');
const app = express();
const port = 3000;
const getUser = require('./fetchData');
const sendMail = require('./sendMail');
let userid = '';
let fetchedData = null;

app.get('/', (req, res) => {
    res.send('server is running');
});

app.listen(port, () => {
    console.log('App is listening');
});

app.get('/send', (req, res) => {
    userid = req.query.userid;
    
    if(!userid){
        res.status(404).send('Sorry, cant find that');
    } else {
       getUser(userid).then(axiosResponse => {
            console.log("axiosResponse => ", axiosResponse);
            fetchedData = axiosResponse;
            
            sendMail(fetchedData);
            
        }).then(mailResponse => {
            console.log("express mail response => ", mailResponse);
            res.send(mailResponse);
        });
    }
});

【问题讨论】:

    标签: node.js express axios nodemailer


    【解决方案1】:

    我从您现有的代码中看到的最大问题是您没有在 then 方法中返回任何内容。话虽如此,我认为通过始终使用 async/await 而不是将其与 Promise 语法混合使用,您将获得很多我的清晰度:

    // sendMail rewrite
    const sendMail = async (data) => {
      try {
        await email.send(mailOptions);
        return true;
      } catch(err) {
        console.log(err);
        return false;
      }  
    }
    
    // get 'send' rewrite
    app.get('/send', async (req, res) => {
      const userid = req.query.userid;
      
      if (!userid) {
        res.status(404).send('Sorry, cant find that');
        return;
      }
      
      try {
        const axiosResponse = await getUser(userid);
        console.log("axiosResponse => ", axiosResponse);
        const mailResponse = await sendMail(axiosResponse);
        console.log("express mail response => ", mailResponse);
        res.send(mailResponse);
      } catch(err) {
        // Do something with any errors here
      }
    });
    

    【讨论】:

    • 我根据您编写的内容编辑了我的代码。有用。非常感谢!
    猜你喜欢
    • 2011-03-28
    • 1970-01-01
    • 1970-01-01
    • 2016-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多