测试 REST API - req.body 未定义(Node.js / Express / Mocha / Supertest)
Testing REST API - req.body undefined (Node.js / Express / Mocha / Supertest)
我正在尝试测试一个内置于 Node 中的 REST API。我已经使用 Postman 手动测试了 API,没有任何问题,但是我在使用 Mocha/Chai/Supertest 编写测试时遇到了问题。
当我尝试测试发送到路由时,请求正文未定义。到目前为止,在我的研究中,我似乎无法发现我正在做的事情与其他人相比有任何有意义的区别,但由于某种原因,我尝试发送的数据没有通过。
路由的处理方式如下:
router.route('/media')
.post(RouteController.postMedia);
RouteController.postMedia = function(req, res) {
var media = new Media();
console.log(req.body);
media.title = req.body.title;
media.type = req.body.type;
media.tags = req.body.tags;
media.pubdate = req.body.pubdate;
media.editdate = req.body.editdate;
media.filename = req.body.filename;
media.extension = req.body.extension;
media.description = req.body.description;
media.save(function(err) {
if (err)
res.send(err);
res.json({ message: 'File added!', data: media });
});
};
这是我的测试:
var request = require('supertest'),
should = require('chai').should(),
express = require('express'),
mongoose = require('mongoose'),
app = express();
require('../api/routes')(app);
var db = require('./config/db');
describe('API Routing', function() {
before(function(done) {
mongoose.createConnection(db.url);
done();
});
describe('Media', function () {
it('should add new photo to database with call to POST /api/v1/media', function(done) {
var photo = {
title: 'Test Photo',
type: 'photo',
tags: ['test', 'test2', 'asdf'],
filename: 'test-photo.jpg',
description: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.'
};
request(app)
.post('/api/v1/media')
.send(photo)
.end(function(err, res) {
if (err) {
throw err
}
res.status.should.equal(200);
done();
});
});
});
运行测试时出现错误 TypeError: Cannot read property 'title' of undefined
,因为 req.body 未定义。 console.log(req.body);
部分确认 req.body 未定义。
这里有两种可能性(好吧,一种确定和一种可能性):
首先,您需要告诉 supertest
您正在发送类型 JSON(或您发送的任何其他类型)。
request(app)
.post('/api/v1/media')
.type('json')
.send(photo)
其次,您是否在节点中设置了bodyParser?不确定您使用的是什么框架,但它们都需要某种形式的主体解析,无论是内置的还是外部的。 https://www.npmjs.com/package/body-parser
我也遇到了同样的问题。我通过添加以下行解决了这个问题:
app.use(bodyParser.json());
我正在尝试测试一个内置于 Node 中的 REST API。我已经使用 Postman 手动测试了 API,没有任何问题,但是我在使用 Mocha/Chai/Supertest 编写测试时遇到了问题。
当我尝试测试发送到路由时,请求正文未定义。到目前为止,在我的研究中,我似乎无法发现我正在做的事情与其他人相比有任何有意义的区别,但由于某种原因,我尝试发送的数据没有通过。
路由的处理方式如下:
router.route('/media')
.post(RouteController.postMedia);
RouteController.postMedia = function(req, res) {
var media = new Media();
console.log(req.body);
media.title = req.body.title;
media.type = req.body.type;
media.tags = req.body.tags;
media.pubdate = req.body.pubdate;
media.editdate = req.body.editdate;
media.filename = req.body.filename;
media.extension = req.body.extension;
media.description = req.body.description;
media.save(function(err) {
if (err)
res.send(err);
res.json({ message: 'File added!', data: media });
});
};
这是我的测试:
var request = require('supertest'),
should = require('chai').should(),
express = require('express'),
mongoose = require('mongoose'),
app = express();
require('../api/routes')(app);
var db = require('./config/db');
describe('API Routing', function() {
before(function(done) {
mongoose.createConnection(db.url);
done();
});
describe('Media', function () {
it('should add new photo to database with call to POST /api/v1/media', function(done) {
var photo = {
title: 'Test Photo',
type: 'photo',
tags: ['test', 'test2', 'asdf'],
filename: 'test-photo.jpg',
description: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.'
};
request(app)
.post('/api/v1/media')
.send(photo)
.end(function(err, res) {
if (err) {
throw err
}
res.status.should.equal(200);
done();
});
});
});
运行测试时出现错误 TypeError: Cannot read property 'title' of undefined
,因为 req.body 未定义。 console.log(req.body);
部分确认 req.body 未定义。
这里有两种可能性(好吧,一种确定和一种可能性):
首先,您需要告诉 supertest
您正在发送类型 JSON(或您发送的任何其他类型)。
request(app)
.post('/api/v1/media')
.type('json')
.send(photo)
其次,您是否在节点中设置了bodyParser?不确定您使用的是什么框架,但它们都需要某种形式的主体解析,无论是内置的还是外部的。 https://www.npmjs.com/package/body-parser
我也遇到了同样的问题。我通过添加以下行解决了这个问题:
app.use(bodyParser.json());