Node.js / Express / Mocha / Supertest Rest API – 空请求正文

我到处寻找解决办法。 我唯一发现的是一个没有回答的post。 我很抱歉,如果我忽略了一些东西。

问题是,当我尝试在/createQuestion API中获取POST值时,正文为空/未定义。 我得到这样的错误Cannot read proprety 'question' of undefined来自API Cannot read proprety 'question' of undefined

Express API:

 app.post("/createQuestion", function(req, res) { var questionType = req.body.question.type; var questionText = req.body.question.text; var questionDuringClass = req.body.question.duringClass; // Do a bunch of stuff res.send(response); }); 

考试:

  var should = require('should'); var assert = require('assert'); var request = require('supertest'); var winston = require('winston'); request = request('http://localhost:8080'); describe('Questions', function() { // Test suite before(function(done) { done(); }); it('Should create a freeResponse question', function(done) { // Test case var postData = { "question" : { "type" : "freeResponse", "text" : "This is a test freeResponse question (automated testing)", "duringClass" : "1" } }; request() .post('/createQuestion') .send(postData) .expect(200) .end(function(err, res) { // .end handles the response if (err) { return done(err); } done(); }); }); it('Should delete a freeResponse question', function(done) { // Test case var postData = { "question" : { "type" : "freeResponse", "text" : "This is a test freeResponse question (automated testing)", "duringClass" : "1" } }; request() .post('/deleteQuestion') .send(postData) .expect(200) .end(function(err, res) { // .end handles the response if (err) { return done(err); } done(); }); }); 

我错过了什么? .send()是否以某种不同的格式发送POST数据? 是不是把它发布到请求的主体?

这可能是您的应用程序没有使用bodyParser中间件。

 app.use(express.bodyParser()); 

从expressjs文档:

req.body

该属性是一个包含parsing的请求主体的对象。 这个特性是由bodyParser()中间件提供的,尽pipe其他的bodyparsing中间件也可以遵循这个约定。 当使用bodyParser()时,此属性默认为{}。

这里有一个完整的例子

 var express = require('express'); var request = require('supertest'); var assert = require('assert'); var app = express(); app.use(express.bodyParser()); app.get('/', function(req, res) { res.send('ok'); }); app.post('/createQuestion', function(req, res) { var message = req.body.partA + ' ' + req.body.partB; res.send(message); }); describe('testing a simple application', function() { it('should return code 200', function(done) { request(app) .get('/') .expect(200) .end(function(err, res){ if(err) { done(err); } else { done(); } }); }); it('should return the same sent params concatenated', function(done) { request(app) .post('/createQuestion') .send({ partA: 'Hello', partB: 'World'}) .expect(200, 'Hello World') .end(function(err, res){ if(err) { done(err); } else { done(); } }); }); });