如何停止 stream-to-promise 更改我的原始缓冲区
How to stop stream-to-promise changing my original buffer
我正在使用 stream-to-promise npm 模块在我的 jasmine 测试中创建 multipart/form-data 有效负载。我的有效负载包括一个图像文件作为缓冲区,但是当有效负载通过 stream-to-promise 放置时,它会以某种方式更改或破坏有效负载中的原始图像缓冲区,因此我的测试失败了。有什么办法可以避免这种情况吗?
it('test /identity-verification/your-first-form-of-id POST with validation passing', function(done){
var form = new FormData();
var image = fs.createReadStream("image.png");
streamToBuffer(image, function (err, buffer) {
form.append('firstID', 'passport');
form.append('firstIDImage', buffer);
var headers = form.getHeaders();
streamToPromise(form).then(function(payload) {
var options = {
method: 'POST',
url: '/identity-verification/your-first-form-of-id',
payload: payload,
headers: headers
};
server.inject(options, function(response) {
expect(response.statusCode).toBe(302);
expect(response.headers.location).toMatch('/identity-verification/your-first-form-of-id/upload-successful');
done();
});
});
});
});
通过 stream-to-promise 放置后的有效负载中的缓冲区如下所示:
您不需要流到缓冲区。您已经从 createReadStream 获得了缓冲区。如果你摆脱它,它应该工作。要注意的一件事是您的 maxBytes 设置得足够高以容纳您的测试图像。这在我测试时导致了一些神秘的错误。
下面的代码对我来说工作正常。
var streamToPromise = require("stream-to-promise");
var FormData = require("form-data");
var fileTypeModule = require("file-type");
var fs = require("fs");
var q = require("q");
var Hapi = require('hapi');
var server = new Hapi.Server({ debug: { request: ['error'] } });
server.connection({
host: 'localhost',
port: 8000
});
server.route({
method: 'POST',
path: '/test',
handler: function(request, reply) {
var data = request.payload.firstIDImage;
var fileType = fileTypeModule(data);
reply(fileType);
},
config: {
payload: { maxBytes: 1048576 }
}
});
var start = server.start();
var form = new FormData();
var headers = form.getHeaders();
form.append('firstID', 'passport');
form.append('firstIDImage', fs.createReadStream("image.png"));
var append = streamToPromise(form);
q.all([start, append]).then((results) => {
var options = {
method: 'POST',
url: '/test',
payload: results[1],
headers: headers
};
server.inject(options, function(response) {
console.log(response.payload);
});
});
我正在使用 stream-to-promise npm 模块在我的 jasmine 测试中创建 multipart/form-data 有效负载。我的有效负载包括一个图像文件作为缓冲区,但是当有效负载通过 stream-to-promise 放置时,它会以某种方式更改或破坏有效负载中的原始图像缓冲区,因此我的测试失败了。有什么办法可以避免这种情况吗?
it('test /identity-verification/your-first-form-of-id POST with validation passing', function(done){
var form = new FormData();
var image = fs.createReadStream("image.png");
streamToBuffer(image, function (err, buffer) {
form.append('firstID', 'passport');
form.append('firstIDImage', buffer);
var headers = form.getHeaders();
streamToPromise(form).then(function(payload) {
var options = {
method: 'POST',
url: '/identity-verification/your-first-form-of-id',
payload: payload,
headers: headers
};
server.inject(options, function(response) {
expect(response.statusCode).toBe(302);
expect(response.headers.location).toMatch('/identity-verification/your-first-form-of-id/upload-successful');
done();
});
});
});
});
通过 stream-to-promise 放置后的有效负载中的缓冲区如下所示:
您不需要流到缓冲区。您已经从 createReadStream 获得了缓冲区。如果你摆脱它,它应该工作。要注意的一件事是您的 maxBytes 设置得足够高以容纳您的测试图像。这在我测试时导致了一些神秘的错误。
下面的代码对我来说工作正常。
var streamToPromise = require("stream-to-promise");
var FormData = require("form-data");
var fileTypeModule = require("file-type");
var fs = require("fs");
var q = require("q");
var Hapi = require('hapi');
var server = new Hapi.Server({ debug: { request: ['error'] } });
server.connection({
host: 'localhost',
port: 8000
});
server.route({
method: 'POST',
path: '/test',
handler: function(request, reply) {
var data = request.payload.firstIDImage;
var fileType = fileTypeModule(data);
reply(fileType);
},
config: {
payload: { maxBytes: 1048576 }
}
});
var start = server.start();
var form = new FormData();
var headers = form.getHeaders();
form.append('firstID', 'passport');
form.append('firstIDImage', fs.createReadStream("image.png"));
var append = streamToPromise(form);
q.all([start, append]).then((results) => {
var options = {
method: 'POST',
url: '/test',
payload: results[1],
headers: headers
};
server.inject(options, function(response) {
console.log(response.payload);
});
});