2014-09-30 82 views
1

我想从我的form获得data到我的hapijs server。我似乎没有在管理。当我提交form时,data以未定义形式传递,导致服务器上发生错误。从我所了解的hapi自动解析数据。hapijs获取表单数据

有人能帮我理解我做错了什么吗?为什么我变得不确定?

处理表单数据的函数是sendworkout

这是我的路线:

var path = require('path'); 
var _ = require('underscore'); 
var couchbase = require('couchbase'); 

//Connect to database. 

var db = db || new couchbase.Connection({host: 'localhost:8091', bucket: 'default'}, function(err) { 
    if (err) { 
     console.log('Connection Error', err); 
    } else { 
     console.log('Connected!'); 
    } 
}); 
console.log(db); 
//We have a pending connection to the test database running on localhost. 
//We now need to get notified if we connect successfully or if a connection error occurs 


var landingPage = { 
    handler: function(req, reply) { 
     reply.file('index.html'); 
    } 
}; 

var getWorkouts = { 
    handler: function (req, reply) { 
     // set options for databse query 
     var q ={ 
      descending: true, 
      stale: false 
     }; 

     // show multiple exercises - db.view(designDocument, viewName, options) 
     db.view('workout', 'exercise', q).query(function(err, values){ 
      // use pluck method from underscore to retrieve data 
      var keys = _.pluck(values, 'id'); 
      console.log("Keys: " + keys); 

      //fetch multiple documents based on the 'keys' object 
      db.getMulti(keys, null, function(err, results){ 
       console.log('Results: ' + results); 

       var workouts = []; 
       for (var prop in results) { 
        workouts.push(results[prop].value); 
       } 
       reply(workouts); 
      }); 
     }); 
    } 
}; 


var getMusclegroup = { 
    handler: function (req, reply) { 
     var q = { 
      descending: true, 
      stale: false 
     }; 

     db.view('workout', 'exercise', q).query(function(err, values){ 

      var keys = _.pluck(values, 'id'); 

      db.getMulti(keys, null, function(err, results){ 

       var muscleGroups = []; 
       for (var prop in results) { 
        console.log(typeof results); 
        console.log(results[prop].value.workout); 
        muscleGroups.push(results[prop].value.workout); 
       } 
       reply(muscleGroups[0]); 
      }); 
     }); 
    } 
}; 


var sendWorkout = { 
    handler: function(req, reply){ 


     var d = new Date(); 
     var cd = d.getDate() + "-" + (d.getMonth()+1) + "-" + d.getFullYear(); 

     console.log(req.method); // getting a post method - OK 
     console.log(req.body); // returns undefined 

     // defines unique key for data 
     var key = cd; 
     console.log(key); 

     // adds payload to database 
     db.add(key, req.body, function(error, results){ 
      if (error) { 
       console.log("Coushbase error: " + error); 
       reply(error + "\n"); 
      } 
      console.log(results); 
      reply(req.body); 
     }); 
    } 
}; 


var workoutNew = { 
    handler: function (req, reply) { 
     reply.file("static/html/workoutForm.html"); 
    }, 
}; 


module.exports = [ 
    {method: 'GET', path: '/static/{param*}', config: { handler: { directory: { path: 'static'}}}}, 
    {method: 'GET', path: '/', config: landingPage}, 
    {method: 'GET', path: '/workouts', config: getWorkouts}, 
    {method: 'GET', path: '/workouts/musclegroup', config: getMusclegroup}, 
    {method: 'GET', path: '/newworkout', config: workoutNew}, 
    {method: 'POST', path:'/newworkout/workout', config: sendWorkout} 
]; 

这是我的服务器模块:

var Hapi = require('hapi'); 
var path = require('path'); 
var Joi = require('joi'); 
var rs = require('./lib/modules/routes.js'); 


var config= { }; 
var server = Hapi.createServer(process.env.PORT || 8080, config); 

server.route(rs); 

server.start(function(){ 
    console.log("Server started: " + server.info.uri); 
}); 

module.exports = server; 

这是我的HTML表单:

<div id="forms"> 
     <form id="workout-form" name="workout-form" action="newworkout/workout" method="POST"> 

      <div class="workouts"> 
       <label for="exercise" class="labels">Exercise</label><input type="text" name="exercise" id="exercise" placeholder="Which exercise?" autofocus /> 
       <label for="musclegroup" class="labels">Muscle-Group</label><input type="text" name="musclegroup" id="musclegroup" placeholder="Which muscle-group?" /> 

       <div class="sets"> 
        <label for="reps" class="labels">Reps</label><input type="text" name="reps" id="reps" class="reps-column" placeholder="How many reps?" /> 
        <label for="kilos" class="labels">Kg's</label><input type="text" name="kilos" id="kilos" class="kilos-column" placeholder="How much Kg?" /> 
       </div> 
       <hr> 
      </div> 

      <button id="add-set"class="add-buttons" type="button"><i class="fa fa-plus-circle fa-2x"></i></button> 
      <button id="add-exercise" class="add-buttons" type="button"><i class="fa fa-arrow-circle-down fa-2x"></i></button> 
      <button id="submit-workout" type="submit" name="submitbutton"><strong>Save Workout</strong></button> 
     </form> 
    </div> 
+0

Got it!我所要做的就是用'req.payload'替换'req.body',它工作正常! – hyprstack 2014-09-30 22:06:28

+0

不错的一个,你应该自己添加答案,并将它标记为@hyprstack,这样它就不会被打开;) – John 2015-03-03 16:13:33

+1

@John谢谢!刚刚添加了答案。 – hyprstack 2015-03-03 16:49:15

回答

2

只是req.bodyreq.payload取代:

var path = require('path'); 
var _ = require('underscore'); 
var couchbase = require('couchbase'); 

//Connect to database. 

var db = db || new couchbase.Connection({host: 'localhost:8091', bucket: 'default'}, function(err) { 
    if (err) { 
     console.log('Connection Error', err); 
    } else { 
     console.log('Connected!'); 
    } 
}); 
console.log(db); 
//We have a pending connection to the test database running on localhost. 
//We now need to get notified if we connect successfully or if a connection error occurs 


var landingPage = { 
    handler: function(req, reply) { 
     reply.file('index.html'); 
    } 
}; 

var getWorkouts = { 
    handler: function (req, reply) { 
     // set options for databse query 
     var q ={ 
      descending: true, 
      stale: false 
     }; 

     // show multiple exercises - db.view(designDocument, viewName, options) 
     db.view('workout', 'exercise', q).query(function(err, values){ 
      // use pluck method from underscore to retrieve data 
      var keys = _.pluck(values, 'id'); 
      console.log("Keys: " + keys); 

      //fetch multiple documents based on the 'keys' object 
      db.getMulti(keys, null, function(err, results){ 
       console.log('Results: ' + results); 

       var workouts = []; 
       for (var prop in results) { 
        workouts.push(results[prop].value); 
       } 
       reply(workouts); 
      }); 
     }); 
    } 
}; 


var getMusclegroup = { 
    handler: function (req, reply) { 
     var q = { 
      descending: true, 
      stale: false 
     }; 

     db.view('workout', 'exercise', q).query(function(err, values){ 

      var keys = _.pluck(values, 'id'); 

      db.getMulti(keys, null, function(err, results){ 

       var muscleGroups = []; 
       for (var prop in results) { 
        console.log(typeof results); 
        console.log(results[prop].value.workout); 
        muscleGroups.push(results[prop].value.workout); 
       } 
       reply(muscleGroups[0]); 
      }); 
     }); 
    } 
}; 


var sendWorkout = { 
    handler: function(req, reply){ 


     var d = new Date(); 
     var cd = d.getDate() + "-" + (d.getMonth()+1) + "-" + d.getFullYear(); 

     console.log(req.method); // getting a post method - OK 
     console.log(req.payload); 

     // defines unique key for data 
     var key = cd; 
     console.log(key); 

     // adds payload to database 
     db.add(key, req.payload, function(error, results){ 
      if (error) { 
       console.log("Coushbase error: " + error); 
       reply(error + "\n"); 
      } 
      console.log(results); 
      reply(req.payload); 
     }); 
    } 
}; 


var workoutNew = { 
    handler: function (req, reply) { 
     reply.file("static/html/workoutForm.html"); 
    }, 
}; 


module.exports = [ 
    {method: 'GET', path: '/static/{param*}', config: { handler: { directory: { path: 'static'}}}}, 
    {method: 'GET', path: '/', config: landingPage}, 
    {method: 'GET', path: '/workouts', config: getWorkouts}, 
    {method: 'GET', path: '/workouts/musclegroup', config: getMusclegroup}, 
    {method: 'GET', path: '/newworkout', config: workoutNew}, 
    {method: 'POST', path:'/newworkout/workout', config: sendWorkout} 
];