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(); } }); }); });