Как написать промежуточное программное обеспечение Plack, которое запускается после отправки HTTP-ответа клиенту? - PullRequest
2 голосов
/ 29 октября 2019

Мой веб-сервис Plack регистрирует через TCP-соединение с fluentD, и я хотел бы выполнить свой код регистрации после Я отправил ответ клиенту. Это уменьшит время отклика (предположим, что это сервис с большим объемом запросов, где такая оптимизация производительности стоит делать).

По крайней мере еще одна веб-платформа, экспресс для nodejs, поддерживает это, позволяя промежуточным программам добавлять обработчик события on-end для объекта запроса . Я посмотрел на интерфейсы Plack :: Request и Plack :: Response и не увидел аналогичного перехвата событий.

Я думаю, что смогувероятно, сделайте локальное переопределение метода finalize в моем промежуточном программном обеспечении, чтобы заставить фреймворк вести мою регистрацию после того, как ответ завершен, но я бы хотел, если это возможно, избежать работы с внутренностями Plack.

Есть ли лучший способ отложить выполнение некоторого кода до тех пор, пока клиенту не будет отправлен ответ?

Ответы [ 2 ]

2 голосов
/ 29 октября 2019

Спасибо LeoNerd и ilmari за помощь в отладке в MagNET #io-async.

#!/usr/bin/env -S plackup -s Net::Async::HTTP::Server
use Future::AsyncAwait;
use Time::HiRes qw(time);
use Future::IO qw();
use Future::IO::Impl::IOAsync qw();

async sub mylogger {
    # simulate expensive run-time
    await Future::IO->sleep(1);
    open my $log, '>>', '/tmp/so-58605156.log';
    $log->say(time);
}

my $app = sub {
    my ($env) = @_;
    mylogger->retain;
    return [200, ['Content-Type' => 'text/plain'], [time]];
};
0 голосов
/ 29 октября 2019

Фоновый процесс в Nodejs

Вы можете использовать ловушки для входа в фоновом режиме после отправки ответа клиенту.

const add = [
(req, res, next) => {
// do your stuff here
res.json({}); // your response
next();
},
(req) => {
// your background process will run here
}
];

Примечание: при работе с фоновым процессом никогда больше не отправляйте ответ клиенту, иначе это приведет к ошибке, говорящей о невозможности установить уже отправленный заголовок ответа

Это может быть использовано для отправки электронной почты, регистрациии т. д.

...