Nodejs и Express, используйте res.send () из рабочего потока - PullRequest
1 голос
/ 30 октября 2019

В Nodejs, используя Express в качестве сервера, я загружаю тяжелые вычисления в рабочий поток.

Из основного приложения я вызываю рабочий поток следующим образом:

// file: main.js

const { Worker } = require("worker_threads");

function runService(fileName, workerData) {
    return new Promise((resolve, reject) => {
        const worker = new Worker(fileName, { workerData });
        worker.on("message", resolve);
        worker.on("error", reject);
        worker.on("exit", code => {
            if (code !== 0)
                reject(new Error(`Worker stopped with exit code ${code}`));
        });
    });
}

router.get("/some_url", async function(req, res) {
    const result = await runService(
        "./path/to/worker.js",
        { query: req.query, user: req.user } // using { req } causes an error
    );
});

Рабочий выглядит так:

// file: worker.js

const { workerData, parentPort } = require('worker_threads');
const { query, user } = workerData;

async function run() {
    const result = await generateLotsOfData(query, user);

    parentPort.postMessage(result);

    // What I would like to do here (doesn't work): res.send(result);
}

Рабочий генерирует огромное количество данных, а «postMessage» вызывает ошибку сервера.

Есть ли способ отправить эти данные из рабочего потока напрямую клиенту, используя res.send() или что-то подобное?
(вместо использования postMessage и последующей отправки из основного потока)?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...