1

我正试图data从我formhapijs server. 我好像没管。当我提交时form,将data作为未定义传递,这会在服务器上触发错误。据我了解hapi,它会自动解析数据。

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

处理表单数据的函数是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>
4

1 回答 1

3

只需替换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}
];
于 2015-03-03T16:48:47.830 回答