Node.js / Express / Mocha / Supertest Rest API - 空请求体

13

我已经尽我所能寻找解决方案。我找到的唯一信息是一个未被回答的帖子。如果我有所忽略,请谅解。

问题在于,当我尝试在/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数据?它是否未将其POST到请求体中?


你有一个请求(url),url在哪里定义的?是在之前包含的应用程序中吗? - alfonsodev
哦,是的。我在发布之前已经更改了那个。我添加了一行到顶部,用于设置整个请求的URL,而不是将其传递给每个单独的测试。我删除了URL条目。谢谢。 - Mike DeMille
你能试着移除第二个请求吗,(request().post('/deleteQuestion'))? - alfonsodev
好的。谢谢。我移除了第一个 done()。 - Mike DeMille
好的。我已经发布了分离的代码。我在我的系统上尝试过,只是没有发布它。抱歉。结果相同 - res.body为空。 - Mike DeMille
显示剩余4条评论
1个回答

31

很可能是您的应用程序没有使用正确的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();
        }
      });
  });

});

谢谢。就这些了。我非常感激! - Mike DeMille
4
这对我也起作用了。对于 Express 3.x 和 4.x,你应该使用 body-parser 而不是 express.bodyParser():app.use(require('body-parser').json()) - zayquan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接