Как уведомить HTTP-клиента о завершении длинной задачи - PullRequest
0 голосов
/ 11 декабря 2018

У меня есть система Node.js, которая загружает большое количество объектов в MongoDB и создает папки в выпадающем списке для каждого объекта.Это занимает около 0,5 секунд на объект.Поэтому в ситуациях, когда у меня много объектов, это может занять около минуты.В настоящее время я уведомляю клиента о том, что массив объектов был принят, используя код ответа 202.Однако, как мне тогда уведомить клиента о завершении через минуту.

app.post('/BulkAdd', function (req, res) {
    issues = []
    console.log(req.body)
    res.status(202).send({response:"Processing"});
    api_functions.bulkAdd(req.body).then( (failed, issues, success) => {
        console.log('done')
    })

});


bulkAdd: async function (req, callback) {
  let failed = []
  let issues = []
  let success = []
  i = 1

  await req.reduce((promise, audit) => {
    // return promise.then(_ => dropbox_functions.createFolder(audit.scanner_ui)
    let globalData;
  return promise.then(_ => this.add(audit)
      .then((data)=> {globalData = data; return dropbox_functions.createFolder(data.ui, data)}, (error)=> {failed.push({audit: audit, error: 'There was an error adding this case to the database'}); console.log(error)})
        .then((data)=>{console.log(data, globalData);return dropbox_functions.checkScannerFolderExists(audit.scanner_ui)},(error)=>{issues.push({audit: globalData, error: 'There was an error creating the case folder in dropbox'})})
         .then((data)=>{return dropbox_functions.moveFolder(audit.scanner_ui, globalData.ui)},(error)=>{issues.push({audit: globalData, error: 'No data folder was found so an empty one was created'}); return dropbox_functions.createDataFolder(globalData.ui)})
          .then(()=>success.push({audit:globalData}), issues.push({audit: globalData, error: 'Scanner folder found but items not moved'}))
    );
  }, Promise.resolve()).catch(error => {console.log(error)});
  return(failed, issues, success)

},

1 Ответ

0 голосов
/ 11 декабря 2018

Что ж, проблема в том, чтобы заставить клиентский запрос ждать, истечет ли он по истечении определенного периода или иногда выдаст ошибку с no response received.

Что вы можете сделать, это

 - Make client request to server to initiate the task, and return 200OK and keep doing your task on server. 
 - Now write a file on server after insertion of every object as status. 
 - Read the file from client every 5-10 sec to check if server has completed creating objects or not. 
 - Mean while your task is not completed on server, show status with completion percentage or some animation.

Или просто внедрить WebHook или WebSockets для поддержания связи.

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