在Express中发送二进制文件导致ECONNABORTED

问题描述 投票:0回答:1

我目前正在为后端进行一些测试,但我一直不休,特别是某个测试有时会通过,有时却没有通过。如果某些特定的标头不存在,我的警卫就会发生错误以拒绝请求。因此,在我的测试中,应用程序看起来与此类似

beforeEach(() => {
    app = express();
    const router = express.Router();
    router.post('/media/upload',      
      addSpies,
      PostMediaGuard(sinon.stub().resolves(true)),
      multer(getMulterOptions()).fields([{ name: 'File', maxCount: 1 }]),
      upload
    ); 

    app.use('/', router);
  });

现在添加间谍只会将间谍添加到我的需求,资源和下一步,然后继续。该错误发生在我的PostMediaGuard中。在这里,我将检查是否存在标题,如果不存在,则拒绝]

PostMediaGuard

if(typeof(req.headers['x-some-header']) !== 'string')
      return res.status(400).end('No valid RealmId in Header. Please set X-RealmId');

    if(!await _userMayUploadMediaFile(
      req.headers['x-some-header'],
      req.headers.authorization as string,
      req.user
    ))
      return res.status(403).end(`Not allowed to upload media`);

next();

现在,为了进行测试,我将使用supertest向我的应用发出请求。并且请求看起来像这样

Test

await request(app)      
        .post('/media/upload')      
        .attach('File', path.join(__dirname, '../../test/media/dummy.jpg'));   

现在,如果我调试一切正常,我将在代码行中将状态设置为400,并在PostMediaGuard中结束请求。有时在此之后,测试就被确定为正确,有时,我将通过以下堆栈获得ECONNABORTED]

stack:“错误:写ECONNABORTED在afterWriteDispatched(internal / stream_base_commons.js:150:25)在writeGeneric(internal / stream_base_commons.js:141:3)在Socket._writeGeneric(net.js:770:11)在Socket._write(net.js:782:8)在doWrite(_stream_writable.js:431:12)在writeOrBuffer(_stream_writable.js:415:5)在Socket.Writable.write(_stream_writable.js:305:11)在ClientRequest._writeRaw(_http_outgoing.js:295:17)在ClientRequest._send(_http_outgoing.js:271:15)在ClientRequest.end(_http_outgoing.js:732:10)在Transform.onend(_stream_read.js:691:10)在Object.onceWrapper(events.js:299:28)在Transform.emit(events.js:210:5)在endReadableNT(_stream_visible.js:1183:12)在processTicksAndRejections(internal / process / task_queues.js:80:21)“

现在,由于文件是在请求的表单数据中发送的,因此我认为后台正在进行一些流传输,我正在尝试在请求结束之前结束请求。但是,我还没有开始任何处理数据的工作,例如创建读取流或尝试将其存储在数据库中。 (因为防护的要点是,如果不存在所需的标头,我将不会这样做)。到目前为止,实际上我找到的关于该主题的所有答案均归因于蜂鸣启动了一些异步流方法,并试图在请求完成之前终止请求。但是由于我那时还没有开始,所以我不知道我哪里错了

任何想法可能是什么问题?

我目前正在为后端进行一些测试,但我一直不休,特别是某个测试有时会通过,有时却没有通过。错误发生在我的警卫人员拒绝...

node.js express httprequest form-data
1个回答
0
投票

现在这似乎是超级测试(Issue on GitHub)的问题

但是至少有一种解决方法,可以通过将连接设置为在标头中保持活动来使其正常工作。

© www.soinside.com 2019 - 2024. All rights reserved.