Как отложить ответ в Node / Koa? - PullRequest
       9

Как отложить ответ в Node / Koa?

0 голосов
/ 25 сентября 2019

Я пытаюсь использовать setTimeout для задержки возврата ответа в узле.С помощью следующего кода API activAccount дает 404. Он регистрирует «в setTimeout», но ничего не возвращается.Есть ли способ сделать это?

module.exports.activateAccount = function *() {
    this.body = { ok: false };

    if(this.session.otherMembershipFound){
        console.log("in otherMembershipFound");
        setTimeout(function() {
            console.log("in setTimeout");
            this.status = 200;
            this.body = { ok: false, result: { 
                    ok: false
                    , result: null
                    , message: "We encountered one or more validation errors."
                    , debug: "Other Membership Found"
                } 
            };
        }, 3000)    
    } else {}
}

Согласно приведенному ниже объяснению Обещания, я попробовал следующее, но я борюсь с тем, какой должна быть правильная реализация.

if(this.session.otherMembershipFound){
    console.log("in otherMembershipFound");
    return new Promise(resolve => {
        setTimeout(resolve, 3000);
      })
      .then(() => {
        console.log("after");
        this.status = 200;
        this.body = { ok: false, result: { 
                ok: false
                , result: null
                , message: "We encountered one or more validation errors. Please check the entered data and try again. For assistance please call 1 (800)617-3169."
                , debug: "Other Membership Found"
            } 
        };
    }, 3000)    
} else {

При этом я получаю эту ошибку

(node:21796) UnhandledPromiseRejectionWarning: Error [ERR_HTTP_HEADERS_SENT]: Cannot remove headers after they are sent to the client
at ServerResponse.removeHeader (_http_outgoing.js:540:11)

Ответы [ 2 ]

0 голосов
/ 25 сентября 2019

Вы можете использовать библиотеку koa-delay для выполнения этой работы.https://www.npmjs.com/package/koa-delay Следуйте документации на странице библиотеки.

0 голосов
/ 25 сентября 2019

Когда функция промежуточного программного обеспечения Koa возвращается, koa рассматривает запрос done и отправляет обратно все, что может.

Однако, если функция промежуточного программного обеспечения Koa возвращает обещание, она откладывает этопока обещание не будет выполнено.

Таким образом, хитрость в том, чтобы дать koa wait , состоит в том, чтобы вернуть обещание, и выполнить обещание только после того, как вы его полностью выполнили.

PS:Звездочка (*) заставляет меня подозревать, что вы используете Koa 1, или вы следовали учебному пособию по Koa 1. Обычно, если вы видите * и yield, вам понадобятся async и await вместо.

...