Вернитесь рано из продолжительного POST в Node / Express - PullRequest
0 голосов
/ 08 января 2019

Я новичок в Node / Express. У меня есть длительная серия процессов, например: post to Express endpoint -> save data (can return now) -> handle data -> handle data -> handle data -> another process -> etc.

Типичная почта:

app.post("/foo", (req, res) => {
  // save data and return
  return res.send("200");
  // but now I want to do a lot more stuff...
});

Если я опущу return, произойдет больше обработки, но даже если я новичок в этом стеке, я могу сказать, что это плохая идея.

Все, что я хочу - это получить некоторые данные, сохранить их и вернуть. Затем я хочу начать его обработку и вызывать другие процессы, которые обращаются к другим процессам и т. Д. Я не хочу, чтобы исходный POST ожидал завершения всего этого.

Мне нужно сделать это в процессе , поэтому я не могу сохранить в очереди и обработать его отдельно.

В основном я хочу ДЕКОПЛИРОВАТЬ получение и обработку данных, в процессе.

Какие опции доступны при использовании Node / Express?

Ответы [ 2 ]

0 голосов
/ 08 января 2019

Я бы попробовал что-то вроде этого:

const express = require("express");
const port = 3000;
const app = express();
const uuid = require('uuid');

app.post("/foo", (req, res) => {
    const requestId = uuid.v4();
    // Send result. Set status to 202: The request has been accepted for processing, but the processing has not been completed. See https://tools.ietf.org/html/rfc7231#section-6.3.3.
    res.status(202).json({ status: "Processing data..", requestId: requestId });

    // Process request.
    processRequest(requestId, request);
});

app.get("/fooStatus", (req, res) => {
    // Check the status of the request.
    let requestId = req.body.requestId;

});

function processRequest(requestId, request) {
    /* Process request here, then perhaps save result to db. */
}

app.listen(port);
console.log(`Serving at http://localhost:${port}`);

Вызов этого с помощью curl (например):

curl -v -X POST http://localhost:3000/foo

Даст ответ вроде:

{"status":"Processing data..","requestId":"abbf6a8e-675f-44c1-8cdd-82c500cbbb5e"}
0 голосов
/ 08 января 2019

Нет ничего плохого в вашем подходе к удалению return здесь и завершению запроса ..... при условии, что у вас нет другого кода, который пытается отправить какие-либо данные позже.

Я бы рекомендовал вернуть код состояния 202 Принято для этих длительных сценариев, хотя это указывает потребителю, что сервер принял запрос, но он не завершен.

...