【问题标题】:Node.js Mocha Tests - SuperAgent - how can I send a text body instead of JSON?Node.js Mocha 测试 - SuperAgent - 如何发送文本正文而不是 JSON?
【发布时间】:2014-07-17 01:41:53
【问题描述】:

我正在使用 SuperAgent 测试 Node/Express REST API。

使用 .send,正文内容会自动转换为 JSON。我只想发送纯文本。这是一个例子:

request.post('localhost:3000/api/compile' )
        .send('my example text that gets converted to JSON')
        .set('Content-Type', 'application/x-www-form-urlencoded')

我已尝试更改 Content-Type 标头,但仍然发送了一个对象。

如何强制 SuperAgent 仅使用纯文本?


更新 1:按照建议添加 .type('form') 仍默认为 JSON。

request.post('localhost:3000/api/compile' )
        .type('form')
        .send('my example string')
        .set('Authorization', un+':'+key)
         //.set('Content-Type', 'application/x-www-form-urlencoded')
        .end(function(err, res){
                res.should.have.status(200);
                done();
        });

这给了 -

 object
{ 'my example string': '' }

更新 2:添加后端代码。这可能只是快递吗?

app.js

var express = require('express');
var path = require('path');
var favicon = require('static-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');

var routes = require('./routes/index');
var users = require('./routes/users');
var api = require('./routes/api');

var app = express();

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');

app.use(favicon());
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded());
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));

app.use('/', routes);
app.use('/users', users);
app.use('/api', api);

路线:

    router.post('/compile', function(req, res) {
      console.log(typeof(req.body));
      console.log(req.body);

      res.send('respond with a resource');
      res.end();

});

解决方案 - 删除 BodyParser:

var express = require('express');
var path = require('path');
var favicon = require('static-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');

var routes = require('./routes/index');
var users = require('./routes/users');
var api = require('./routes/api');

var app = express();

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');

app.use(favicon());
app.use(logger('dev'));
//app.use(bodyParser.json());
//app.use(bodyParser.urlencoded());

app.use (function(req, res, next) {
    var data='';
    req.setEncoding('utf8');
    req.on('data', function(chunk) {
        data += chunk;
    });
    req.on('end', function() {
        req.rawBody = data;
        next();
    });
});

app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));

app.use('/', routes);
app.use('/users', users);
app.use('/api', api);

【问题讨论】:

  • 请显示您的服务器端代码。我认为它会在那里自动解码。
  • @PeterLyons - 我添加了 Express 后端 - 这是默认设置。我还添加了示例路线。这可能只是 Express BodyParser 吗?
  • 是的,bodyParser 已经将其解析回 json。这就是它的作用。要确认,请在打开开发者工具的情况下在 chrome 中发出您的浏览器请求,并在“网络”选项卡中找到该请求,您可以在那里准确地看到浏览器发送的真实格式。
  • 非常感谢@PeterLyons。是的,通过浏览器进行的测试显示 JSON。我已经删除了 BodyParser 用法 - 请参阅上面的更新示例,因此将对其进行测试。再次感谢!
  • 您在查看“预览”选项卡吗?不要使用那个,你想看看原始请求。我认为您的代码很可能运行良好,但是您对工具缺乏熟悉以及在您的问题和 cmets 中使用技术但并非真正精确的措辞正在给您带来各种困惑。发布您的开发工具请求正文的屏幕截图或设置 plunkr,以便我们可以提供适当的帮助。

标签: node.js express mocha.js superagent


【解决方案1】:

使用.type('form') 表示您已有x-www-form-urlencoded 格式的数据。

request.post('localhost:3000/api/compile')
  .type('form')
  .send('username=bob')

see the docs in the source here。 x-www-form-urlencoded 还有一些其他方便的变体。

关于text/plainapplication/x-www-form-urlencoded,您的问题的描述与代码相互矛盾,但如果您真的想发送纯文本,那就是.type('text/plain')

【讨论】:

  • 非常感谢 cmets。我尝试添加具有相同结果的 .type('form') 。我尝试了许多变体以及将内容类型设置为文本。请参阅上面的修改。
猜你喜欢
  • 1970-01-01
  • 2017-03-26
  • 1970-01-01
  • 1970-01-01
  • 2015-10-23
  • 1970-01-01
  • 1970-01-01
  • 2015-10-10
  • 2014-11-01
相关资源
最近更新 更多