检查属性是否未定义
我正在构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)));