NodeJS разбор многопартийной очереди - PullRequest
0 голосов
/ 27 января 2020

Я загрузил свое приложение в Heroku, и у меня возникли некоторые проблемы, когда я загружаю несколько фотографий в форму через мобильный телефон. Ошибка «Запрос прерван», потому что время ожидания Herokus составляет 30 секунд.

К сожалению, form.parse (req) действительно требуется много времени, когда файлы довольно большие, поэтому ответа от мой сервер в течение 30 секунд.

Вот моя серверная функция:

async function addRestaurant(req, res) {
var oRestaurant = {}
var that = this;

console.log("Function Add-Restaurant")
var form = new multiparty.Form();

return new Promise((resolve, reject) => {

    console.log("in promise");
    form.parse(req, async function (err, fields, files) {
        try {
            console.log(err);
            if(err){
                reject(err);
                return;
            }

            //upload files to database, update firestore, etc...
            ...
        }});

Это мой вывод журнала Heroku:

2020-01-27T17:03:08.962250+00:00 app[web.1]: Function Add-Restaurant
2020-01-27T17:03:08.963043+00:00 app[web.1]: in promise
2020-01-27T17:03:42.643184+00:00 app[web.1]: Error: Request aborted
2020-01-27T17:03:42.643196+00:00 app[web.1]:     at IncomingMessage.onReqAborted (/app/node_modules/multiparty/index.js:190:17)
2020-01-27T17:03:42.643198+00:00 app[web.1]:     at IncomingMessage.emit (events.js:197:13)
2020-01-27T17:03:42.643199+00:00 app[web.1]:     at abortIncoming (_http_server.js:448:9)
2020-01-27T17:03:42.643200+00:00 app[web.1]:     at socketOnClose (_http_server.js:441:3)
2020-01-27T17:03:42.643202+00:00 app[web.1]:     at Socket.emit (events.js:202:15)
2020-01-27T17:03:42.643203+00:00 app[web.1]:     at TCP._handle.close (net.js:611:12)

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

Я пробовал это так:

   var Queue = require('bull');

    var queue = new Queue('adding restaurant');
Pagerouter.route('/restaurant').get(authorizeRoles([Role.FreeUser, Role.PremiumUser]), function (req, res) {
res.render('Pages/add-restaurant');
})
 .post(authorizeRoles([Role.FreeUser, Role.PremiumUser]), function (req, res) {
    // console.log("Adding queue")
    queue.add({ req: req});
    queue.on('completed', function (job, result) {
        // Job completed with output result!
        console.log("completed!")
        res.send(200);
    })
});

queue.process(function (job, done) {
    console.log("in proccess");
    console.log(job);
    functions.addRestaurant(job.data.req, job.data.res).then((id) => {
        req.session.selectedRestaurantID = id;
        done();
    })
        .catch(err => {

            console.log(err);
            if (typeof err !== "string") {
                err = err.toString();
            }
            done(err);
            // res.status(500).send(err);
        });
});

Но теперь моя проблема заключается в следующем:

Adding queue
(node:8977) UnhandledPromiseRejectionWarning: TypeError: Converting circular structure to JSON
    at JSON.stringify (<anonymous>)

Я знаю почему, потому что у объекта запроса есть ссылки, которые не могут быть проанализированы на строку JSON, но я не знаю, как решить мою проблему. Многопартийности нужен объект запроса для анализа формы, но я не могу передать объект запроса в мою очередь.

Можете ли вы мне помочь или вы знаете лучший подход?

...