Я нахожусь в процессе создания массовой рассылки, которая позволяет компании отправлять шаблон электронной почты определенному плану, который содержит X количество подписчиков.
Однако, используя pg-обещание, я не могу понять, как перебрать массив, содержащий одно или несколько уникальных имен планов, которые затем будут использоваться в качестве параметров запроса для последующих запросов, чтобы собрать один массив результатов. Последующие запросы не разрешаются до того, как экспресс отправит обратно указанное сообщение об ошибке.
Например:
const selectedTemplate = await db.oneOrNone("SELECT * FROM templates WHERE userid=$1 and uniqueTemplateName=$2", [req.session.id, req.body.uniquetemplatename])
возвращает объект JSON ...
{ ...
plans : [ 'Unique Plan 1', 'Unique Plan 2', 'Unique Plan 3'...],
...
}
Затем я хочу просмотреть этот массив plans
, чтобы собрать электронные письма подписчиков. Поскольку массив plans
selectedTemplate может содержать один или несколько уникальных планов, я пытаюсь выяснить, как заставить этот запрос работать:
let subscriberEmails = [];
await each(selectedTemplate.plans, async plan => {
const emails = await db.any("SELECT email FROM subscribers WHERE userid=$1 AND planName=$2", [req.session.id, plan])
each(emails, ({email}) => subscriberEmails.push(email))
console.log('Found emails: ', subscriberEmails);
})
console.log('Selected emails: ', subscriberEmails);
res.status(500).json({ message: "Route not configured yet" })
Проблема, с которой я столкнулся, заключается в том, что Express не ожидает разрешения pg-обещания. Таким образом, он вызывает сообщение моего сервера 500 «Маршрут еще не настроен», затем разрешает запросы:
14:48:33 SELECT * FROM templates WHERE userid='12345' and uniqueTemplateName='example-unique-template'
selectedTemplate: anonymous {
id: '84efa448-b149-11e8-a7fd-3b9e4e9e5ece',
key: 9,
userid: '12345',
status: 'active',
fromsender: 'example@helpdesk.com',
subject: 'Thank you for using our services!',
templatename: 'Example Unique Template',
uniquetemplatename: 'example-unique-template',
message: '<h3>This is a test!</h3>',
plans: [ 'Unique Plan 1', 'Unique Plan 2' ]
}
Selected emails: []
POST /api/messages/create 500 28 - 34.125 ms
14:48:33 SELECT email FROM subscribers WHERE userid='12345' AND planName='Unique Plan 1'
Found emails: [
'betatester19@example.com',
'betatester20@example.com',
'betatester21@example.com'
]
14:48:34 SELECT email FROM subscribers WHERE userid='12345' AND planName='Unique Plan 2'
Found emails: [
'betatester19@example.com',
'betatester20@example.com',
'betatester21@example.com',
'betatester1@example.com',
'betatester2@example.com',
'betatester3@example.com',
'betatester4@example.com',
'betatester5@example.com',
'betatester6@example.com',
'betatester7@example.com',
'betatester8@example.com',
'betatester9@example.com',
'betatester10@example.com',
'betatester11@example.com',
'betatester12@example.com',
'betatester13@example.com',
'betatester14@example.com',
'betatester15@example.com',
'betatester16@example.com',
'betatester17@example.com',
'betatester18@example.com'
]
Функция как есть:
async (req, res, done) => {
if (!req.body) {
return res.status(404).json({ message: "Missing query parameters" });
done();
}
try {
const selectedTemplate = await db.oneOrNone("SELECT * FROM templates WHERE userid=$1 and uniqueTemplateName=$2", [req.session.id, uniquetemplatename]);
if (!selectedTemplate) {
return res.status(404).json({ message: "Unable to locate selected template" });
done();
}
console.log('selectedTemplate', selectedTemplate);
let subscriberEmails = [];
await each(selectedTemplate.plans, async plan => {
const emails = await db.any("SELECT email FROM subscribers WHERE userid=$1 AND planName=$2", [req.session.id, plan])
each(emails, ({email}) => subscriberEmails.push(email))
console.log('Found emails: ', subscriberEmails);
})
console.log('Selected emails: ', subscriberEmails);
res.status(500).json({ message: "Route not configured yet" })
} catch (err) { res.status(500).json({ message: err }); done(); }
}
Значительно упрощенная структура БД:
├── Template
│ └── Plans (references an array of unique plan name(s))
|
|── Plan
| └── PlanName (unique plan name)
|
│── Subscriber
| └── PlanName (references a single unique plan name)
| └── Email (unique email)
Я пытался использовать db.task()
, но, опять же, запросы не разрешались до того, как Express отправил сообщение обратно.