我正在使用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]”之类的字符串
答案 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只是导航到标题并添加应该工作的内容类型。 或者您也可以在代码中添加一行以使其正常工作。