【发布时间】: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