Node.js / Express / Mocha / Supertest Rest API - пустое тело запроса
Я искал везде, где я могу найти решение этой проблемы. Единственное, что я нашел, - это оставленный без ответа пост. Я прошу прощения, если я что-то упустил.
Проблема в том, что когда я пытаюсь получить POST
значения в /createQuestion
API, тело пустое / неопределенное. Я получаю такие ошибки Cannot read proprety 'question' of undefined
исходя из API.
Экспресс 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
данные в каком-то другом формате? Это не POST
это в теле запроса?
1 ответ
Вероятно, ваше приложение не использует промежуточное программное обеспечение bodyParser.
app.use(express.bodyParser());
Из документов expressjs:
req.body
Это свойство является объектом, содержащим анализируемое тело запроса. Эта функция предоставляется промежуточным программным обеспечением bodyParser(), хотя другое промежуточное программное обеспечение для синтаксического анализа тела также может следовать этому соглашению. Это свойство по умолчанию имеет значение {}, когда используется 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();
}
});
});
});