2013-10-25 21 views
12

Bu konuya çözüm bulabilmem için her yere baktım. Bulduğum tek şey cevapsız bir mesaj. Bir şeyi gözden kaçırırsam özür dilerim.Node.js/Express/Mocha/Üst Düzey Dinlenme API - Boş İstek Gövde

Sorun, /createQuestion API'sinde POST değerlerini almaya çalıştığımda, gövdenin boş/tanımsız olmasıdır. API'den gelen bu Cannot read proprety 'question' of undefined gibi hatalar alıyorum.

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

testi:

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

ben eksik? .send()POST verilerini farklı bir biçimde mi gönderiyor? İsteğin gövdesine POST değil mi?

+0

tanımlanır gelmiş eksiksiz bir örnek var mı? Daha önce dahil ettiğiniz bir uygulama mı? – alfonsodev

+0

Oh, doğru. Göndermeden önce bunu değiştirdim. Her bir sınama iletmek yerine tüm isteğin URL'sini ayarlamak için satırı ekledim. URL girişlerini kaldırdım. Teşekkürler –

+0

işin bittiğini unutmayın() sadece bir kez denir, ilk kez aradığında, testi bitirir. – alfonsodev

cevap

27

Muhtemelen uygulamanız bodyParser ara katmanını kullanmıyordur. expressjs Dokümanlar

app.use(express.bodyParser()); 

:

req.body

Bu özellik ayrıştırıldı istek gövdesini içeren bir nesnedir. Bu özellik bodyParser() ara katman yazılımı tarafından sağlanmakla birlikte, diğer vücut ayrıştırma ara katmanları da bu sözleşmeyi izleyebilir. BodyParser() kullanıldığında, bu özellik varsayılan olarak {} olarak bulunur. İşte

Eğer istek (URL), nerede url

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

}); 
+0

Teşekkür ederim. Öyleydi. Gerçekten onu takdir ederim! –

+2

Bu benim için de çalıştı. Express 3.x ve 4.x için _body-parser_ express.bodyParser(): 'app.use 'yi kullanmalısınız (require (' body-parser '). Json())' – zayquan