SendGrid 时事通讯订阅确认错误(通过电子邮件确认将用户添加到自定义列表)

问题描述 投票:0回答:0

当我单击通过 SendGrid API 通过电子邮件发送的确认链接时,API 方法本身发生 ResponseError。这个错误有时会发生,有时不会,没有明显的模式。我不知道是什么导致了错误以及如何解决它,因为它似乎超出了我的代码的控制范围。

P.S: 请记住,此注册确认基本上是一种将用户添加到已创建列表的方法。我的代码中有一些 console.logs,有时它们会激活,有时它们不会,这让我认为错误发生在不同的执行时间。

错误:

ResponseError: Not Found
        at D:\...\newsletter-app\node_modules\@sendgrid\client\src\classes\client.js:146:43
        at process.processTicksAndRejections (node:internal/process/task_queues:95:5) {
      code: 404,
      response: {
        headers: {
          server: 'nginx',
          date: 'Mon, 24 Apr 2023 16:08:01 GMT',
          'content-type': 'application/json',
          'content-length': '0',
          connection: 'close',
          'x-amzn-requestid': 'ff2850b3-10d6-45e7-89ca-82abf55496fd',
          'x-amzn-remapped-x-amzn-requestid': 'e078e687-9479-4a79-bac3-d3d07ff9886c',
          'x-amzn-remapped-content-length': '0',
          'x-sendgrid-pod-id': '0',
          'x-amz-apigw-id': 'D49nNEQ2IAMEVoA=',
          'x-amzn-trace-id': 'Root=1-6446a961-5fb958d32b248f5115be5275;Sampled=0;lineage=5cb8ea5c:0',
          'x-amzn-remapped-date': 'Mon, 24 Apr 2023 16:08:01 GMT',
          'x-sendgrid-podrouter-region': 'us-east-1',
          'x-envoy-upstream-service-time': '330',
          'referrer-policy': 'strict-origin-when-cross-origin',
          'x-content-type-options': 'nosniff',
          'x-ratelimit-limit': '600',
          'x-ratelimit-remaining': '599',
          'x-ratelimit-reset': '59'
        },
        body: ''
      }
    }

services.js(只获取确认方式):

// GET CONFIRMATION
const confirmSignUp = async (req, res) => {
    try {
        const contact = await getContactByEmail(req.query.email);

        if (contact == null) throw 'Contact not found.';

        if (contact.custom_fields.conf_num == req.query.conf_num) {
            const listID = await getListID('Newsletter Subscribers');
            console.log('services confirmSignUp listID e req.query.email:', listID, req.query.email);

            await addContactToList(req.query.email, listID);
        } else {
            throw 'Confirmation number does not match';
        }
        res.render('message', { data: { title: 'Thank You!', message: '<p class="subtitle">You are now subscribed to our newsletter!</p><p class="message">We can\'t wait for you to hear from us!</p>' } });
    } catch (error) {
        console.error(error);
        res.render('message', { data: { title: 'Error', message: '<p class="subtitle">Subscription was unsuccessful</p><p class="message">Please <a href="/signup">try again</a></p>' } });
    }
}

utils.js(方法 getContactByEmail、getListID、addContactToList - 它们用于 confirmSignUp 服务):

// get contact by email address
const getContactByEmail = async (email) => {
    const data = {
        "emails": [email]
    };

    const request = {
        url: '/v3/marketing/contacts/search/emails',
        method: 'POST',
        body: data
    }

    // TODO: confirm error in this promise?
    const response = await sgClient.request(request);

    if (response[1].result[email]) return response[1].result[email].contact;
    else return null;
}

// get the list id
const getListID = async (listName) => {
    console.log('getListID listName:', listName);
    const request = {
        url: '/v3/marketing/lists',
        method: 'GET',
    }

    const response = await sgClient.request(request);
    console.log('response:', response);
    const allLists = response[1].result;
    return allLists.find(x => x.name === listName).id;
}

// add a contact in a list (newsletter)
const addContactToList = async (email, listID) => {
    const data = {
        "list_ids": [listID],
        "contacts": [{
            "email": email
        }]
    };

    const request = {
        url: '/v3/marketing/contacts',
        method: 'PUT',
        body: data
    }

    return sgClient.request(request);
}

代码有一些 console.logs,但它们有时会触发,有时不会。很难弄清楚错误发生在哪个方法中,因为它似乎发生在不同的时间,但我相信它要么是 getContactByEmail 要么是 getListID。

node.js sendgrid sendgrid-api-v3
© www.soinside.com 2019 - 2024. All rights reserved.