【问题标题】:UnhandledPromiseRejectionWarning using sendgrid使用 sendgrid 的 UnhandledPromiseRejectionWarning
【发布时间】:2021-04-16 03:39:40
【问题描述】:

我已经被卡了很长时间了,现在我收到了这个错误,上面写着 UnhandledPromiseRejectionWarning 这不是我在表单控制器中捕获错误的情况

npm 版本

"@sendgrid/mail": "^6.4.0"

当我尝试使用邮递员正文发送电子邮件时:

(node:1504) UnhandledPromiseRejectionWarning:未处理的承诺拒绝。此错误源于在没有 catch 块的情况下抛出异步函数内部,或拒绝未使用 .catch() 处理的承诺。要在未处理的 Promise 拒绝时终止节点进程,请使用 CLI 标志 --unhandled-rejections=strict(请参阅 https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode)。 (拒绝编号:2)

我从错误中得到这个对象

code: 403,
  response: {
    headers: {
      server: 'nginx',
      date: 'Fri, 16 Apr 2021 04:16:35 GMT',
      'content-type': 'application/json',
      'content-length': '281',
      connection: 'close',
      'access-control-allow-origin': 'https://sendgrid.api-docs.io',
      'access-control-allow-methods': 'POST',
      'access-control-allow-headers': 'Authorization, Content-Type, On-behalf-of, x-sg-elas-acl',
      'access-control-max-age': '600',
      'x-no-cors-reason': 'https://sendgrid.com/docs/Classroom/Basics/API/cors.html',
      'strict-transport-security': 'max-age=600; includeSubDomains'
    },
    body: { errors: [Array] }
  }
}

 {
        "name":"fares",
        "email":"essayehfares@gmail.com",
        "message":"This is test This is testThis is testThis is testThis is testThis is testThis is testThis is testThis is testThis is testThis is testThis is testThis is testThis is testThis is testThis is test This is test" 
}

电子邮件的表单控制器

const sgMail = require('@sendgrid/mail'); // SENDGRID_API_KEY
sgMail.setApiKey(process.env.SENDGRID_API_KEY);

    exports.contactForm = (req, res) => {
        const { email, name, message } = req.body;
        // console.log(req.body);
    
        const emailData = {
            to: process.env.EMAIL_TO,
            from: email,
            subject: `Contact form - ${process.env.APP_NAME}`,
            text: `Email received from contact from \n Sender name: ${name} \n Sender email: ${email} \n Sender message: ${message}`,
            html: `
                <h4>Email received from contact form:</h4>
                <p>Sender name: ${name}</p>
                <p>Sender email: ${email}</p>
                <p>Sender message: ${message}</p>
                <hr />
                <p>This email may contain sensetive information</p>
            `
        };
    
        sgMail.send(emailData).then(sent => {
            return res.json({
                success: true
            }).catch(error=>{
                console.log('error',error)
            })
        
        });
    };
    
    exports.contactAssignmentAuthorForm = (req, res) => {
        const { authorEmail, email, name, message } = req.body;
        // console.log(req.body);
    
        let maillist = [authorEmail, process.env.EMAIL_TO];
    
        const emailData = {
            to: maillist,
            from: email,
            subject: `Someone messaged you from ${process.env.APP_NAME}`,
            text: `Email received from contact from \n Sender name: ${name} \n Sender email: ${email} \n Sender message: ${message}`,
            html: `
                <h4>Message received from:</h4>
                <p>name: ${name}</p>
                <p>Email: ${email}</p>
                <p>Message: ${message}</p>
                <hr />
                <p>This email may contain sensetive information</p>
         
            `
        };
    
        sgMail.send(emailData).then(sent => {
            return res.json({
                success: true
            }).catch((error) => {
                console.log('error', error);
            });
        });
    };

形成路线

const express = require('express');
const router = express.Router();
const { contactForm, contactAssignmentAuthorForm } = require('../controllers/form');

// validators
const { runValidation } = require('../validators');
const { contactFormValidator } = require('../validators/form');

router.post('/contact', contactFormValidator, runValidation, contactForm);
router.post('/contact-assignment-author', contactFormValidator, runValidation, contactAssignmentAuthorForm);

module.exports = router;

表单验证器

const { check } = require('express-validator');

exports.contactFormValidator = [
    check('name')
        .not()
        .isEmpty()
        .withMessage('Name is required'),
    check('email')
        .isEmail()
        .withMessage('Must be valid email address'),
    check('message')
        .not()
        .isEmpty()
        .isLength({ min: 15 })
        .withMessage('Message must be at least 20 characters long')
];

环境文件

NODE_ENV=development
APP_NAME=SUIVISTAGE
PORT=8000
CLIENT_URL=http://localhost:3000
DATABASE_LOCAL='mongodb://localhost:27017/stage'
JWT_SECRET=KDJHF7823RHIU3289FJ932I2G8FG239
SENDGRID_API_KEY=SG.5YsBW3I7Ra2IcLLiJXfc1g.R1XYPG3SyWfyl0G1w0D5hsh5CGvECIvjYSjRcHtisDc
EMAIL_TO=faresessayeh@gmail.com

【问题讨论】:

    标签: node.js express postman sendgrid


    【解决方案1】:

    您在错误的行上使用了 catch,res.json 不需要 catch 块。将 catch 块附加到 sendgrid.then 方法,如下所示

        sgMail.send(emailData).then(sent => {
            return res.json({
                success: true
            })
        }).catch(error=>{
           console.log('error',error)
        })
    

    另外,不要像这样公开发布您的 API 密钥,它们不是理解您的代码所必需的。

    【讨论】:

    • 仍然没有解决同样的问题,sendgrid 中是否有任何配置我应该关心设置 -> Api Keys -> 我创建了一个并复制了它,就是这样
    • 有两个地方你必须做同样的事情(catch 块),你是否更新了两个地方(即在contactAssignmentAuthorForm & contactForm 函数中?
    • 经过大量研究后,我刚刚更新了代码,我认为他们更新了身份验证方式,它需要一些配置 [link]sendgrid.com/docs/ui/sending-email/sender-verification
    • 我查看过,似乎首先您必须创建发件人的身份和 API 密钥,并将特定 IP 地址列表添加到列表中才能成功发送电子邮件。您可以使用error.response.body 记录错误响应正文以查看详细错误。
    【解决方案2】:

    问题已通过遵循本指南 sendgrid.com/docs/ui/sending-email/sender-verification 解决,您需要验证您的发件人才能完成此操作

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-07-31
      • 1970-01-01
      • 2021-08-05
      • 2019-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多