почему результат загрузки является ошибкой, но никогда не идет в .catch в requestPromise - PullRequest
0 голосов
/ 29 марта 2020

это мой тестовый файл для загрузки, и я объясняю его шаг за шагом:
Я написал тест для загрузки файла. метод загрузки, написанный с модулем busboy, и он работает верно, но у меня есть проблема в тесте. когда результатом загрузки является ошибка, эта ошибка никогда не возвращается в .catch и go в .then.
подробнее объясняем в коде:

const http = require('http');
// const request = require('request');
const rp = require('request-promise');
const fs = require('fs');
const assert = require('chai').assert;
const port = process.env.PORT || 80;
const Q = require('q');
let server;



const options = {
  method: 'POST',
  uri: 'http://127.0.0.1/upload',
  formData: {
    name: 'test',
    file: {
      value: fs.createReadStream('./test/test.jpg'),
      options: {
        filename: 'test.jpg',
        contentType: 'image/jpg'
      }
    }
  },
  headers: {
    'Connection': 'Keep-Alive',
    'content-type': 'multipart/form-data'  // Is set automatically
  },
  json: true,
};


function startServer(port, cb) {
  server = http.createServer(function (req, res) {
    if (req.method === 'POST') {
      if (req.url === '/upload') {
        serveRequest(req, res);
      }
    }
  });
  server.listen(port, () => {
    cb(function stopServer(done) {
      setTimeout(function () {
        server.close();
        done();
      }, 20);
    });
    console.log(`listening on port ${port} ...`);
  });
}




function serveRequest(request, response) {
  if (request.headers.hasOwnProperty('content-type')
    && request.headers['content-type'].split(';')[0] === 'multipart/form-data') {
    serveUpload(request, response);
  }
}

function serveUpload(request, response) {
  uploader.upload(request, function (error, res) {
    if (error) {

      response.end();
    }
    else {
      response.write(JSON.stringify(res));
      response.end();
    }
  });
}

// -----------------------
describe('upload', function () {
  let stopServer = null;
  before('start server', function (done) {
    startServer(port, function (stop) {
      stopServer = stop;
      done();
    });
  });
  it('upload a file - options is true', function (done) {
    rp(options)
      .then(function (r) {
        console.log(r);
      })
      .catch(function (error) {
        console.log(error);
      });

  });

  after('stop server', function (done) {
    stopServer(done);
  });
});

Я делаю запрос к загрузчику и результат мой запрос возвращается в метод serveUpload (). Результатом serveUpload () является error, а error - объект типа этого:

error = 
meta: {
   code: '',
   sourceType: 'module',
   sourceName: '',
   version: '2.0.4'
 },
 data: {
   message: {
     en: 'uploaded data size is out of limit'
   }
 }
}

эта ошибка должна возвращать .catch (e) в rp (опции), но на самом деле она должна go to. затем (r) в rp (параметры)
войти в систему .then не определено.

rp(options)
     .then(function (r) {
       console.log(r); // error always come here But in fact it must go to catch and r is undefined
     })
     .catch(function (error) {
       console.log(error);  
     });

Я не понимаю, почему это происходит, я был бы очень признателен, если бы кто-нибудь мог мне помочь.

...