node.js路由验证json正文

时间:2014-05-22 12:45:52

标签: json node.js express mongoose

我使用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"}

1 个答案:

答案 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/