Как использовать SendGrid API с шаблонами Dynami c с NodeJS - PullRequest
2 голосов
/ 10 января 2020

У меня есть динамический c шаблон в SendGrid, использующий Postman с запросом POST к https://api.sendgrid.com/v3/mail/send

со следующим json:

{
    "personalizations": [{
        "to": [{
            "email": "dariusgoore@gmail.com",
            "name": "test"
        }],
        "dynamic_template_data":{
            "name":"John",
            "text": "Someone just added a new post!",
        }
    }],
    "from": {
        "email": "team@writerboards.com",
        "name": "test"
    },
    "reply_to": {
        "email": "dariusgoore@gmail.com",
        "name": "test"
    },
    "template_id": "d-c8f201dd360d40bc877da13a1a0b36b1"
}

работает для отправки электронного письма с использованием шаблона.

Однако я не могу отправить аналогичный запрос от Express.

Вот мой маршрут, который вызывает SendGrid (конец точка отвечает на задание cron):

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

let router = express.Router();

router.get('/', async (req, res) => { 
  // getdate 14 days ago
  var ago_date = new Date();
  ago_date.setDate(ago_date.getDate()-0)
  // loop through users
  console.log('crons: getting users');
  const users = await User.query();
  console.log('crons:  number of users: ', users.length);
  for (const user of users) {

console.log(user.username)
const lastAct = await Act
  .query()
  .where('users_id', user.id)
  .orderBy('created_at', 'desc')
  .limit(1);

  const msg = {
    to: 'dariusgoore@gmail.com',
    from: 'team@writerboards.com',
    templateId: 'd-c8f201dd360d40bc877da13a1a0b36b1',

    dynamic_template_data: {
      subject: 'Testing Templates',
      name: 'Some One',
      text: 'Denver',
    },
  };

  console.log('this is the msg 2b sent: ', msg)
  const {
    classes: {
      Mail,
    },
  } = require('@sendgrid/helpers');
  const mail = Mail.create(msg);
  const body = mail.toJSON();
  console.log('this is the body: ', body);
  await sgMail.send(msg); 

  res.json({
    success: true, message: 'ok'
  });   // respond back to request
// };
  };

  res.json({
    success: true, message: 'ok' 
  }); 
});

вот трассировка ошибок, показывающая ошибку:

Ошибка [ERR_HTTP_HEADERS_SENT]: Невозможно установить заголовки после их отправки клиенту:

Полный след ниже:

userone
sending email re on post
this is the msg 2b sent:  { to: 'dariusgoore@gmail.com',
  from: 'team@writerboards.com',
  templateId: 'd-c8f201dd360d40bc877da13a1a0b36b1',
  dynamic_template_data:
   { subject: 'Testing Templates',
     name: 'Some One',
     text: 'Denver' } }
this is the body:  { from: EmailAddress { email: 'team@writerboards.com', name: '' },
  subject: undefined,
  personalizations: [ { to: [Array], dynamic_template_data: [Object] } ],
  template_id: 'd-c8f201dd360d40bc877da13a1a0b36b1' }
usertwo
sending email re on post
this is the msg 2b sent:  { to: 'dariusgoore@gmail.com',
  from: 'team@writerboards.com',
  templateId: 'd-c8f201dd360d40bc877da13a1a0b36b1',
  dynamic_template_data:
   { subject: 'Testing Templates',
     name: 'Some One',
     text: 'Denver' } }
this is the body:  { from: EmailAddress { email: 'team@writerboards.com', name: '' },
  subject: undefined,
  personalizations: [ { to: [Array], dynamic_template_data: [Object] } ],
  template_id: 'd-c8f201dd360d40bc877da13a1a0b36b1' }
(node:19822) UnhandledPromiseRejectionWarning: Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
    at ServerResponse.setHeader (_http_outgoing.js:470:11)
    at ServerResponse.header (/Users/dariusgoore/development/writerboard/writerboard-express-api/node_modules/express/lib/response.js:771:10)
    at ServerResponse.send (/Users/dariusgoore/development/writerboard/writerboard-express-api/node_modules/express/lib/response.js:170:12)
    at ServerResponse.json (/Users/dariusgoore/development/writerboard/writerboard-express-api/node_modules/express/lib/response.js:267:15)
    at router.get (/Users/dariusgoore/development/writerboard/writerboard-express-api/src/routes/crons.js:54:11)
    at process._tickCallback (internal/process/next_tick.js:68:7)
(node:19822) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 3)

1 Ответ

0 голосов
/ 21 марта 2020

Извините за поздний ответ, но я думаю, что главная проблема здесь в том, что вы отправляете 2 ответа в конце своей функции, а во второй раз express сообщает вам, что вы уже отправили ответ, выдав исключение.

Не уверен, что часть кода sendgrid верна, на самом деле я искал дополнительную документацию по шаблону API Dynami c.

...