我正在构建一个节点+表达应用程序,我正在使用从前端的表单提交的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数据,以避免这种行为。
现在我只发布“street”而不是address.street来避免这种行为。
答案 0 :(得分:1)
我不知道你是否在项目中使用jQuery,但是如果你这样做,你可以创建一个掩码:
// creating your object mask
var req = {
body: {
name: '',
phone: '',
address: {
street: '',
postalCode: '',
city: ''
},
owner: {
email: '',
password: ''
}
}
}
然后,您只需使用jQuery "extend" method(req2是您的submmited对象):
$.extend(true, req, req2);
我为您创建了this fiddle!
与您的问题无关,但我刚刚注意到您将具有类似req.body结构的对象传递给Business类。但是,不需要手动复制属性 - 例如,您可以将req.body的简单副本作为参数传递:
var b = new Business($.extend({}, req.body));
或
var b = new Business(JSON.parse(JSON.stringify(req.body)));
答案 1 :(得分:0)
你不能,真的。你有两个选择;
使用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;
}
...然后,您可以将req.body.address.street
等替换为get('req.body.address.street', req)
。
在这里查看演示; http://jsfiddle.net/W8YaB/