web-dev-qa-db-ja.com

Node.js / Express / Mocha / Supertest RestAPI-空のリクエストボディ

私はこれに対する解決策を見つけるために私ができるところならどこでも探しました。私が見つけた唯一のものは、未回答の投稿です。見落としがあった場合はお詫び申し上げます。

問題は、_/createQuestion_ APIでPOST値を取得しようとすると、本体が空/未定義であるということです。この_Cannot read proprety 'question' of undefined_のようなエラーがAPIから発生します。

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データを別の形式で送信していますか?リクエストの本文にPOSTingしていませんか?

12
Mike DeMille

アプリが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();
        }
      });
  });

});
28
alfonsodev