我简单的restfull api的问题:在body-parser和.delete表达式中没有rawBody不工作?

时间:2015-12-23 06:29:04

标签: javascript node.js rest express

我正在使用express4,mongoose和body解析器构建一个简单的restful API作为中间件。

Index.js

//base setup
var express = require('express'); // call express
var mailsystem = express(); // define our app using express
var bodyParser = require('body-parser');
var InDb = require('./mailsystem/client/clientsend');
var mangoose = require('mongoose');
var morgan = require('morgan');
mailsystem.use(morgan('dev'));
// require('daemon')();

mangoose.connect('mongodb://abc:abc@ds031982.mongolab.com:31982/mailsystem2');

// configure app to use bodyParser()
// this will let us get the data from a POST
mailsystem.use(bodyParser.urlencoded({
  extended: true
}));
mailsystem.use(bodyParser.json());

mailsystem.use(function(req, res, next) {
  req.rawBody = '';
  req.setEncoding('utf8');

  req.on('data', function(chunk) {
    req.rawBody += chunk;
  });

  req.on('end', function() {
    next();
  });
});

var port = process.env.PORT || 8080; // set our port

// ROUTES FOR OUR API
// =============================================================================
var router = express.Router(); // get an instance of the express Router

router.use(function(req, res, next) {
  console.log('inside route');
  next();
});
router.route('/clietsends')

.post(function(req, res, next) {


    //req.rawBody ='';
    //req.setEncoding('utf-8');
    // var mine;
    //var contentType = req.headers['content-type'] || '', mime = contentType.split(';')[0];


    var clientsend = new InDb();
    //clientsend.name = req.body.name;
    clientsend.emailId = req.body.emailId;
    clientsend.subject = req.body.subject;
    clientsend.message = req.body.message;
    var email = clientsend.emailId;
    var sub = clientsend.subject;
    var mess = clientsend.message;
    //Call_mandrill(email, sub, mess);
    console.log(req.body);
    console.log(req.params);
    clientsend.save(function(err) {
      if (err)
        res.send(err);
      else {
        req.body += req.rawBody;
        //req.rawBody += req.params;
        res.json(req.body);
        //console.log(req.params);
      }

      // res.json({message:'message of post created'})
    });
  })
  .get(function(req, res) {
    //need not to initiliaze again
    /*var clientsend = new InDb();
    clientsend.name = req.body.name;
    */
    InDb.find(function(err, clientsend) {
      if (err)
        res.send(err);

      res.json(clientsend);
    });
  });

router.route('/clietsends/:clietsend_id')
  .get(function(req, res) {

    InDb.findById(req.params.clietsend_id, function(err, clientsend) {
      if (err)
        res.send(err);
      res.json(clientsend);
    });
  })
  .put(function(req, res) {

    InDb.findById(req.params.clietsend_id, function(err, clientsend) {

      if (err)
        res.send(err);
      clientsend.emailId = req.body.emailId;
      clientsend.subject = req.body.subject;
      clientsend.message = req.body.message;

      // save the update 
      clientsend.save(function(err) {
        if (err)
          res.send(err);
        res.json(req.body);
        //res.json({ message: 'client updated!' });
      });

    });
  })

.delete(function(req, res) {
  InDb.remove({
    _id: req.params.clietside_id
  }, function(err, clientsend) {
    if (err)
      res.send(err);
    //var m = req.body;
    delete req.params.clietsend_id;
    console.log(req.params.clietsend_id);
    res.json({
      message: 'Successfully deleted'
    });
  });
});

// test route to make sure everything is working (accessed at GET http://localhost:8080/api)
router.get('/', function(req, res) {
  res.json({
    message: 'add /clietsends to view all'
  });
});

// more routes for our API will happen here

// REGISTER OUR ROUTES -------------------------------
// all of our routes will be prefixed with /api
mailsystem.use('/testapi', router);

// START THE SERVER
// =============================================================================
mailsystem.listen(port);
console.log('open port' + port);


//function mandrill
// =============================================================================
function Call_mandrill(email, sub, mess) {
  var mandrill = require('mandrill-api/mandrill.js');

  function log(obj) {
    //$('#response').text(JSON.stringify(obj));
    console.log(JSON.stringify(obj));
  }
  var m = new mandrill.Mandrill('9VUmdqbiZFiLCev4C_8Q6A');
  // LOOK HERE TO CHANGE FROM EMAIL ID
  //========================================
  var params = {
    "message": {
      "from_email": "noreply@signzy.com",
      "to": [{
        "email": email
      }],
      "subject": sub,
      "text": mess,
      "autotext": true,
      "track_opens": true,
      "track_links": true
    }
  };

  function sendTheMail() {

    m.messages.send(params, function(res) {
      log(res);
    }, function(err) {
      log(err);
    });
  }

  function run() {
    sendTheMail();
    return false;
  }
  run();

}

和mailsystem / client /

中的clietsend.js

// mailsystem/client/clientside.js

var mongoose = require('mongoose');
var Schema = mongoose.Schema;

var SendSchema = new Schema({
  emailId String, 
  subject String,
  message String 
});

module.exports = mongoose.model('Sent', SendSchema);

一切正常,除了我有两个我无法弄清楚的问题:

1)正文/输入格式为xxx-urlencoded我希望它是原始的,所以经过this post并对我的代码进行了更改,因为你可以在评论中看到它们但它们看起来似乎没有上班。我究竟做错了什么?有人可以举个例子吗?

2).delete函数返回json对象但不删除它。不知道为什么PUT,PUSH,GET似乎工作正常。

在jakerela建议相应更改之后但是问题出在res.json(reqbody)上,返回一个字符串,我想要一个json对象,并且还会返回类似“[object object]”之类的字符串

2 个答案:

答案 0 :(得分:0)

看起来你实际上并没有按照其他帖子中的说明进行操作。主体解析器根本不提供原始主体数据,而是必须在路径之前使用Express中间件并使用Streams来实现它。

在之前添加此代码其他路线(可能是第19行):

app.use(function(req, res, next) {
  req.rawBody = '';
  req.setEncoding('utf8');

  req.on('data', function(chunk) { 
    req.rawBody += chunk;
  });

  req.on('end', function() {
    next();
  });
});

您可以从其他路线中访问req.rawBody

答案 1 :(得分:0)

好吧我弄清楚了,上面的代码根本不需要任何rawBody,只是在标题中添加了内容类型,并且工作正常。 因为我使用postman只是导航到标题并添加应该工作的内容类型。 或者您也可以在代码中添加一行以使其正常工作。