node.js - 如何使用带有 NodeJS 的动态模板的 SendGrid API

标签 node.js express sendgrid-api-v3

我在 SendGrid 中有一个动态模板,s.t.使用 Postman 向 https://api.sendgrid.com/v3/mail/send 发出 POST 请求

使用以下 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]:发送到客户端后无法设置 header :

完整跟踪如下:
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)

最佳答案

为多年来迟到的响应道歉,我们实际上已经重新设计了整个后端和 tbh,我不记得我们到底做了什么。无论如何,这是工作路线的代码,调用SendGrid:

const express = require('express');
const auth = require('../middlewares/authenticate');
const axios = require('axios');
const User = require('../models/User');
const Post = require('../models/Post');
const Group = require('../models/Group');
const Analytics = require('analytics-node');
const client = new Analytics('write key');

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

let router = express.Router();


//POST new post route 
router.post('/', auth.required, async (req, res, next) => {
  // const users = await User.query();
  await Post.query()
  .insert({
    body: req.body.post.body,
    users_id: req.user.id,
    groups_id: req.body.post.groupId,
    parents_id: req.body.post.parents_id
  })
  console.log('tracking code next')
  let poster = await User.query().findById(req.user.id)
  let group = await Group.query().findById(req.body.post.groupId).eager('user')
  client.track({
    event: 'Post created',
    userId: req.user.id,
    properties: {
      body: req.body.post.body
    }
  });
  console.log('sending email re on post')
  let newPost = req.body
  console.log("new post object is: ", newPost)
  console.log("group users count is: ", group.user.length)
  let recipients = group.user.filter( el => el.id !== poster.id );
  console.log("poster is: ", poster.email)
  // console.log("recipients is: ", recipients)
  console.log("recips length is: ", recipients.length)
  
  // check to see if environment is production before sending email
  console.log('this is node environment: ', process.env.NODE_ENV)
  if (process.env.NODE_ENV === 'production') {
    for (let i = 0; i < recipients.length; i++) {
      const msg = {
        from: "dariusgoore@gmail.com",
        template_id: process.env.SENDGRID_NEW_POST,
        asm: {
            groupId: 20914 // new post notification list
        },
        personalizations: [{
            to: { email: recipients[i].email },
            dynamic_template_data: {
                subject: "New Post: " + poster.username + " just posted something",
                recipient_name: recipients[i].username, 
                poster_name: poster.username,
                group_name: group.name,
                post_text: newPost.post.body,
                button_url: process.env.VUE_HOME_URL,
            },
        }],
        
      };
      let sendResult = sgMail.send(msg);
    }
  }
  // console.log(sendResult);

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

module.exports = router;

关于node.js - 如何使用带有 NodeJS 的动态模板的 SendGrid API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59688500/

相关文章:

node.js - 在 Node 中使用 request 和express 制作代理

node.js - 我想使 href 标签动态化并且值将被填充并且我有 ejs 模板

node.js - 将变量传递给expressjs 3条路线

Sendgrid:如何对不同的消息集使用不同的跟踪设置

python - 我在通过 SendGrid 发送电子邮件时在标题中添加了“回复”和“引用”,但它不起作用

email - Sendgrid:使用模板版本支持多种语言

node.js - 发布 package-lock.json 时出现什么问题

Node.js、Express 和 css、js、图片资源

javascript - Express-Session 中的对象方法

javascript - 保存 AJAX 调用返回的 Blob(可能是数据!)到 Azure Blob 存储会创建损坏的图像