Strapi Beta с настраиваемым кодом контроллера Sendgrid для электронной почты

Структура бета-версии Strapi изменила архитектуру плагинов, удален каталог / plugins, и теперь плагины хранятся в каталоге / node_modules. Я пытаюсь написать собственный код для отправки электронного письма с подтверждением после размещения заказа. В предыдущей версии Strapi каталог плагинов электронной почты находился здесь:

/server/plugins/email/controllers

В этом каталоге был написан следующий код, работающий в альфа-режиме в контроллере SEND:

Прокомментируем это: // await.strapi.plugins.email.services.send(options, config);

А затем этот код используется в контроллере SEND внутри module.exports некогда существовавшего контроллера электронной почты ...

let options = ctx.request.body;

   try {
   // send email to user
   await strapi.plugins['email'].services.email.send({
      to: options.to,
      from: '[email protected]',
      subject: options.subject,
      text: options.text,
      html: options.html
   })
} catch (err) {
   return ctx.badRequest(null, err);
}

   // Send 200 'ok;
   ctx.send({});

Хорошо, это был контроллер Strapi Send на стороне сервера ... теперь на клиенте после возврата обещания для заказа мы запускаем еще одно обещание для электронного письма с подтверждением, которое попадает в Strapi API:

await.strapi.request('POST', '/email', { 
   data: {
      to: confirmationEmailAdress,
      subject: "Order Confirmation',
      text: 'Your order has been processed',
      html: '<b>Expect your stuff to arrive broken. Thanks.</b>'
   }
});

Вкратце, теперь вопрос в том, что архитектура Strapi изменилась, не знаю, где разместить код моего сервера выше, а также URL-адрес API для вызова электронной почты. У меня есть настройка SendGrid в Strapi с ключом API, разрешениями, и все в порядке, просто вопрос, где правильное место для размещения этого кода теперь, когда бета-архитектура изменилась с альфа-версии?

* ОБНОВЛЕННЫЙ КОД *

По предложению Джима я создал контроллер электронной почты в папке / extensions следующим образом:

/server/extensions/email/controllers/Email.js

Email.js

'use strict';

module.exports = {

  send: async (ctx) => {
    let options = ctx.request.body;

    try {
      //Send email to the user
      await strapi.plugins['email'].services.email.send({
        to: options.to,
        from: '[email protected]',
        subject: options.subject,
        text: options.text,
        html: options.html
      });
    } catch (err) {
      return ctx.badRequest(null, err);
    }
  }
}

Теперь в клиенте я использую обещание с React для вызова нашего расширения электронной почты следующим образом:

await strapi.request('POST', '/email', {
        data: {
          to: confirmationEmailAddress,
          subject: `Order Confirmation - South of Sleep ${new Date(Date.now())}`,
          text: 'Your order has been processed',
          html: '<bold>Except your stuff to be broken upon arriving</bold>'
        }
      });

Оно работает! Электронное письмо отправлено из Strapi, и я вижу, что информация в контроллере является частью электронного письма. Эта проблема?

Обещание в клиенте является частью попытки / улова, и после отправки электронного письма оно возвращает 404, потому что не может найти /email в качестве маршрута. Итак, я не понимаю, почему он работает и находит контроллер расширения для электронной почты, запускает электронное письмо, но возвращает 404 для маршрута.

Я неправильно вызываю контроллер расширения с клиента.


person Rachel    schedule 25.10.2019    source источник


Ответы (1)


Теперь вам нужно будет следовать документации по настройке. Вот документ https://strapi.io/documentation/3.0.0-beta.x/concepts/customization.html#plugin-extensions.

  • Вам нужно будет создать файл, который будет следовать пути к файлу, который вы хотите обновить.
  • Затем вы копируете только ту функцию, которая вам нужна.
  • И, наконец, вы добавляете свой звонок в службу электронной почты.
person Jim LAURIE    schedule 28.10.2019
comment
Спасибо, Джим. У меня все работает, за исключением случаев, когда клиент выполняет вызов post / url, который возвращает s 404. Контроллер электронной почты расширения вызывается, электронное письмо отправляется, и он работает, но по какой-то причине URL-адрес / email возвращает 404. Я буду поместите приведенный выше код в мой вопрос - person Rachel; 03.11.2019
comment
Это потому, что ваш контроллер не возвращает никаких данных. Просто добавьте ctx.send({ok: true}) или что-то в этом роде. - person Jim LAURIE; 04.11.2019
comment
Превосходно. Спасибо, Джим. Работает отлично! - person Rachel; 05.11.2019