Я загрузил свое приложение в 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, но я не знаю, как решить мою проблему. Многопартийности нужен объект запроса для анализа формы, но я не могу передать объект запроса в мою очередь.
Можете ли вы мне помочь или вы знаете лучший подход?