Node.js Mocha Tests-SuperAgent-如何发送文本正文而不是JSON?
我正在使用SuperAgent测试Node/Express REST API 使用.send,正文内容将自动转换为JSON。我只想发送纯文本。以下是一个例子:Node.js Mocha Tests-SuperAgent-如何发送文本正文而不是JSON?,node.js,express,mocha.js,superagent,Node.js,Express,Mocha.js,Superagent,我正在使用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')
request.post('localhost:3000/api/compile' )
.send('my example text that gets converted to JSON')
.set('Content-Type', 'application/x-www-form-urlencoded')
我已尝试更改内容类型标题,但仍发送了一个对象
如何强制SuperAgent仅使用纯文本
更新1:Adding.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);
使用.type('form')
表示您已经有x-www-form-urlencoded
格式的数据
request.post('localhost:3000/api/compile')
.type('form')
.send('username=bob')
。x-www-form-urlencoded还有一些其他方便的变体
关于
text/plain
与application/x-www-form-urlencoded
,您的问题的描述与代码有冲突,但是如果您真的想发送纯文本,请键入('text/plain')非常感谢您的评论。我尝试添加.type('form'),但结果相同。我尝试了许多不同的方法,同时将内容类型设置为文本。请查看上面的编辑。请显示服务器端代码。我想它会在那里自动解码。@PeterLyons-我已经添加了Express后端-这是默认设置。我还添加了示例路线。这可能就是ExpressBodyParser吗?是的,BodyParser已经将其解析回json。它就是这样做的。要确认,请在chrome浏览器中打开开发者工具,并在“网络”选项卡中找到请求,您可以准确地看到浏览器发送的真实格式。非常感谢@PeterLyons。是的,通过浏览器测试显示JSON。我已经删除了BodyParser的用法-请参阅上面更新的示例,因此我们将对此进行测试。再次感谢!您正在查看“预览”选项卡吗?不要使用那个,你要查看原始请求。我认为你的代码很可能工作得很好,但是你对工具不熟悉,在你的提问和评论中使用了技术性但不精确的措辞,这会给你带来各种各样的困惑。发布你的开发工具请求主体的屏幕截图,或者设置一个plunkr,这样我们就可以适当地提供帮助。