检查属性是否未定义

我正在构build一个node + express应用程序,并且用从前端表单提交的JSON填充对象。 这工作,除非我在表单中留空字段,以便例如req.body.address.street为空/未定义。

这将导致错误:

TypeError: Cannot read property 'street' of undefined var b = new Business({ name: req.body.name, phone: req.body.phone, address: { street: req.body.address.street, postalCode: req.body.address.postalCode, city: req.body.address.city }, owner: { email: req.body.owner.email, password: req.body.owner.password } }); 

我的问题是我怎样才能最好的防止我的应用程序崩溃时,值为空。 我想避免手动检查我的应用程序中的每个属性对未定义。

我想知道这个常见问题的最佳做法是什么。

谢谢!

更新:谢谢你,所有的答案都非常有见地。 我决定简化我的POST数据以避免这种行为。

现在我只是发布“街道”,而不是address.street,以避免这种行为。

你不能,真的。 你有两个select,

使用try / catch:

 try { var b = new Business({ // }); } catch (e) { // Something wasn't provided. } 

…或者你可以定义一个辅助函数:

 function get(path, obj) { path = path.split('.'); path.shift(); // Remove "req". while (path.length && obj.hasOwnProperty(path[0])) { obj = obj[path.shift()]; } return !path.length ? obj : null; } 

…你可以用get('req.body.address.street', req)replace你对req.body.address.street等的使用。

在这里看到一个演示; http://jsfiddle.net/W8YaB/

我不知道你是否在你的项目中使用jQuery,但如果你这样做,你可以创build一个掩码:

 // creating your object mask var req = { body: { name: '', phone: '', address: { street: '', postalCode: '', city: '' }, owner: { email: '', password: '' } } } 

然后,您只需使用jQuery“扩展”方法 (req2是您的submmited对象):

 $.extend(true, req, req2); 

我为你创造了这个小提琴 !

更新

没有关系到你的问题,但我刚刚注意到,你正在传递一个类似的商业类req.body结构的对象。 但是,不需要手动复制属性,例如,可以将req.body的简单副本作为参数进行传递:

 var b = new Business($.extend({}, req.body)); 

要么

 var b = new Business(JSON.parse(JSON.stringify(req.body)));