检查属性是否未定义

时间:2014-05-02 11:45:08

标签: javascript json node.js 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数据,以避免这种行为。

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

2 个答案:

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