我使用express,body-parser和moongose来构建一个带有Node.js的RESTful Web服务。我在POST请求的主体中获取了json数据,该函数如下所示:
router.route('/match')
// create a match (accessed at POST http://localhost:3000/api/match)
.post(function(req, res) {
if (req._body == true && req.is('application/json') == 'application/json' ) {
var match = new Match(); // create a new instance of the match model
match.name = req.body.name; // set the match name and so on...
match.host = req.body.host;
match.clients = req.body.clients;
match.status = req.body.status;
// save the match and check for errors
match.save(function(err) {
if (err) {
//res.send(err);
res.json({ status: 'ERROR' });
} else {
res.json({ status: 'OK', Match_ID: match._id });
}
});
} else {
res.json({ status: 'ERROR', msg: 'not application/json type'});
}
});
用于在数据库中存储匹配的模型Im如下所示:
// app/models/match.js
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var MatchSchema = new Schema({
name: String,
host: String,
clients: { type: [String]},
date: { type: Date, default: Date.now },
status: { type: String, default: 'started' }
});
module.exports = mongoose.model('Match', MatchSchema);
但是如何验证POST请求正文中的json数据是否具有我想要的键/值字段?为了澄清,我不想在数据库中插入不完整的数据。如果我测试跳过json数据中的键/值对,我在数据库中得到一个缺少的字段,当我尝试在我的代码中读取req.body.MISSING_FIELD参数时,我得到了未定义。除了模型中的日期之外的所有字段都是必需的。
我使用这样的json字符串在数据库中添加匹配
{"name": "SOCCER", "host": "HOST_ID1", "clients": ["CLIENT_ID1", "CLIENT_ID2"], "status": "started"}
答案 0 :(得分:0)
我使用了一个非常简单函数,该函数接受一个键数组,然后循环遍历并确保req.body [key]并非虚假值。修改它以仅容纳未定义的值很简单。
在app.js中
app.use( (req, res, next ) => {
req.require = ( keys = [] ) => {
keys.forEach( key => {
// NOTE: This will throw an error for ALL falsy values.
// if this is not the desired outcome, use
// if( typeof req.body[key] === "undefined" )
if( !req.body[key] )
throw new Error( "Missing required fields" );
})
}
})
在您的路线处理程序中
try{
// Immediately throws an error if the provided keys are not in req.body
req.require( [ "requiredKey1", "requiredKey2" ] );
// Other code, typically async/await for simplicity
} catch( e ){
//Handle errors, or
next( e ); // Use the error-handling middleware defined in app.js
}
这仅检查以确保主体包含指定的键。 IT不会验证以任何有意义的方式发送的数据。这对于我的用例来说很好,因为如果数据完全丢失,那么我将只处理catch块中的错误,并向客户端返回HTTP错误代码。 (还考虑发送有意义的有效载荷)
如果您想以更复杂的方式验证数据(例如,确保电子邮件格式正确等),则可能需要研究验证中间件,例如https://express-validator.github.io/docs/