与undefined相比的typeof error - 数据为null

时间:2016-01-26 00:13:05

标签: javascript jquery ajax prestashop

我有一些代码可以帮助我解决错误 - 我似乎无法找到解决方法或在javascript中找到一个好的解决方案。

        var data = new FormData();

        $.each(files, function(key, obj)
        {
            data.append(obj.name, obj.file);
        });

        data.append('submitCustomizedDatas', 1);
        data.append('ajax', 1);
    $.ajax({
        url: $('#customizationForm').attr('action'),
        type: 'POST',
        data: data,
        cache: false,
        dataType: 'json',
        processData: false,
        contentType: false,
        async: false,
        success: function(data, textStatus, jqXHR)
        {
            if(typeof data.errors === 'undefined')
            {
                $.each(files, function(key, obj)
                {
                    $('input[name="'+obj.name+'"]').addClass('filled');
                    previewFile($('input[name="'+obj.name+'"]'), obj.file);

                });
                $('.uploadingfiles').text('Upload Complete!');
            }
            else
            {
               $('.uploadingfiles').text('Error while uploading, please refresh the page and try again');
            }
            $('.myoverlay').click(function(){$(this).remove()});
        },
        error: function(jqXHR, textStatus, errorThrown)
        {
           $('.uploadingfiles').text('ERRORS: ' + errorThrown);
            $('.myoverlay').click(function(){$(this).remove()});
        }
    });

这用于在我正在制作的网站上传文件。

这一点Ajax在JS控制台成功时就开始出错了。错误是说“数据为空”'在这一行:

if(typeof data.errors === 'undefined')

如果这看起来正确,或者如果可能有一些非常明显的东西我在这里失踪,那就好奇了。

2 个答案:

答案 0 :(得分:1)

在javascript中,the opening brace placement matters。您的代码可能并不意味着您认为这意味着您放置了支架。

此外,不推荐使用.success和.error。 Consider using .done or .fail methods.

Typeof null返回一个对象,因此如果data.errors为null,则检查将失败。考虑做

if (!data.errors) {
    ...
}

最后,从服务器返回的数据可能为null。这将导致您看到的null异常。您可以调试应用程序以查看是否属于这种情况。

答案 1 :(得分:0)

您描述的错误"数据为空...",非常精确。当您尝试从null对象访问属性时,JavaScript会引发错误。在这种情况下,您尝试访问errors对象的data属性,在这种情况下为null(您的服务器未返回任何内容)。

在进行任何其他假设之前,您应该验证数据对象:

success: function(data, textStatus, jqXHR) {
    if (data !== null) { // first make sure data is not null
        if(typeof data.errors === 'undefined') { // then you can safely trust this line
            // ...
        }
    }
    // ...
}

观看jqXHR.status可能是了解服务器状况的方法。

编辑:实际上,我建议您始终使用服务器响应的状态代码来检查错误:

success: function(data, textStatus, jqXHR) {
    if (jqXHR.status === 200) { // 200 - Success
        // Everything went well
        // ...
    } else {
        // Something went wrong
        // console.log(textStatus);
        if (data !== null) { // first make sure data is not null
            if(typeof data.error !== 'undefined') { // // check if the server has returned any error information
                // handle specific error
                // console.log(data.error);
                // ...
            }
        }
    }
}

希望它有所帮助!