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

});
Другие вопросы по тегам