javascript - Supertest + Restify gzip响应文件上传

标签 javascript node.js restify supertest superagent

我懂了

TypeError: Cannot read property 'status' of undefined

当尝试使用 supertest 将文件上传到简单的 Restify 服务器时,并且打开了 gzipResponse

版本等:

$ npm list | grep 'super\|mocha\|restify'
├─┬ mocha@2.4.5
├─┬ restify@4.0.4
└─┬ supertest@1.2.0
  └─┬ superagent@1.8.3

$ node -v
v5.5.0

服务器:

const restify = require('restify');
const server = restify.createServer();

server.use(restify.gzipResponse());

server.put('image', (req, res) => {
    res.send(200);
});

module.exports = server;

测试:

const request = require('supertest');
const server = require('./index');
const path = require('path');

describe('insertImage', function () {

    it('should send an image', done => {
        request(server)
            .put('/image')
            .attach('image', path.join(__dirname, 'pc.png'))
            .expect(200, done);
    });

});

禁用gzipResponse时测试将通过,如果没有附加文件也将通过。

我不确定这个问题是否与 superagent/supertest 相关,或者问题是否出在 Restify/gzip 上。如有任何帮助,我们将不胜感激。

最佳答案

我认为这可能是您的项目的服务器配置问题。我认为supertestsuperagent处理 gzip 响应就好了。

这是我编写的摩卡测试片段,显示它的工作原理。当然,这是使用 Express 服务器,但它仍然启用了 gzip 压缩。

var express = require('express');
var supertest = require('supertest');
var compression = require('compression');
var path = require('path');

var app = express();
app.use(compression());

app.get('/test', function(req, res) {
    res.sendStatus(200);
});

app.put('/image', function(req, res) {
    res.sendStatus(200);
});

describe('Test gzip with file upload', function(){
  it('Get a test page', function(done) {
    supertest(app)
        .get('/test')
        .expect(200)
        .end(function(err, res){
            if (err) return done(err);
            done();
        });
  });

  it('Upload an image', function(done) {
    supertest(app)
        .put('/image')
        .attach('image', path.join(__dirname, 'pc.png'))
        .expect(200)
        .end(function(err, res){
            if (err) return done(err);
            done();
        });
  });
});

虽然我没有太多使用restify,但我只是创建了一个使用restify作为服务器的快速示例,并且使用supertest的测试仍然通过。在上面的示例中,您需要添加 server.listen 调用吗?

var supertest = require('supertest');
var restify = require('restify');
var path = require('path');

var server = restify.createServer();
server.use(restify.gzipResponse());

server.get('/test', function(req, res) {
  res.send(200);
});
server.put('/image', function(req, res) {
  res.send(200);
});

server.listen(3000, function() {
  console.log('%s listening at %s', server.name, server.url);
});



describe('Test gzip with file upload', function(){
  it('Get a test page', function(done) {
    supertest(server)
      .get('/test')
      .expect(200)
      .end(function(err, res){
        if (err) return done(err);
        done();
      });
  });

  it('Upload an image', function(done) {
    supertest(server)
      .put('/image')
      .attach('image', path.join(__dirname, 'neo.jpg'))
      .expect(200)
      .end(function(err, res){
        if (err) return done(err);
        done();
      });
  });
});

关于javascript - Supertest + Restify gzip响应文件上传,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36306505/

相关文章:

javascript - expressjs中的路由错误

node.js - 如何在webpack中使用child_process

node.js - 使用 Restify 的 CORS 配置

javascript - jQueryUI 无法打开模态对话框

javascript - 损坏的图像路径 instafeed.js

javascript - 当字符串包含单引号时使用js替换XSL变量的值

javascript - 异步等待 + Gulp - GulpUglifyError : unable to minify JavaScript?

javascript - 将 Javascript 文件导入 REPL session

node.js - 尝试在 Restify API 中使用 Mongoose 保存模型时不会返回响应

javascript - Node Restify 发回一个整数?