use*_*827 9 node.js express sendgrid-api-v3
我在 SendGrid 中有一个动态模板,使用 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"
}
Run Code Online (Sandbox Code Playgroud)
可以使用模板发送电子邮件。
但是,我似乎无法从 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'
});
});
Run Code Online (Sandbox Code Playgroud)
这是显示错误的错误跟踪:
错误 [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)
Run Code Online (Sandbox Code Playgroud)
use*_*827 13
对于多年来迟到的回应表示歉意。
我们实际上重新设计了整个后端,说实话,我不记得我们到底做了什么。
无论如何,这是工作路线的代码:
const express = require('express');
const axios = require('axios');
const Analytics = require('analytics-node');
const client = new Analytics('write key');
const auth = require('../middlewares/authenticate');
const User = require('../models/User');
const Post = require('../models/Post');
const Group = require('../models/Group');
// SendGrid initialization
const sgMail = require('@sendgrid/mail');
sgMail.setApiKey(process.env.SENDGRID_API_KEY);
let router = express.Router();
router.post('/', auth.required, async (req, res, next) => {
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
});
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
}
});
let newPost = req.body;
let recipients = group.user.filter(el => (
el.id !== poster.id
));
// Check to see if the environment is in production before sending the email.
if(process.env.NODE_ENV !== "production") return res.json({
success: false,
message: "fail"
});
for(let i = 0; i < recipients.length; i++){
sgMail.send({
from: "email@domain.com",
template_id: process.env.SENDGRID_NEW_POST,
asm: {
// new post notification list
groupId: 20914
},
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,
},
}]
});
}
res.json({ success: true, message: "ok" });
});
Run Code Online (Sandbox Code Playgroud)
小智 0
抱歉回复晚了,但我认为这里的主要问题是您在函数结束时发送了 2 个响应,而第二次,express 告诉您您已经通过抛出异常发送了响应。
不确定代码的 sendgrid 部分是否正确,我实际上是在寻找有关动态模板 API 的更多文档。
| 归档时间: |
|
| 查看次数: |
13158 次 |
| 最近记录: |