【问题标题】:Ajax response status 200 but shows error messageAjax 响应状态 200 但显示错误消息
【发布时间】:2021-09-15 14:18:23
【问题描述】:

我的状态为 200,但它正在打印消息出现在错误消息 alert("error..."); 中。为什么会这样?

function makeSelect() {
    var blouseoption = document.querySelector('input[name="blouseoption"]:checked').value;
    var url = "http://dukano.co/sakhidev/retailon/productoption/values";
    alert(url);
    var jsondata = $j('#customoption').serialize();     
    alert("jsondata: " + JSON.stringify(jsondata));

    $j.ajax({    
        type : 'POST',
        url : url,
        data : jsondata,
        dataType : 'json',
        success : function(response) {
            console.log("calling");
            console.log(response);
            alert("call success");
            alert("response data:" + JSON.stringify(response));  
            if (response.status == 200) {
                console.log("yes");
            } else if (response.status == "error") {
                console.log("no");
            }

        },
        error : function(response) {
            alert("error...");
            alert("response:" + JSON.stringify(response));
            console.log(response);
        }
    });
}

Magento 的控制器函数返回 json 值

  public function valuesAction(){
            $blouseoption = $this->getRequest()->getParam('blouseoption');
            $sareefinishing = $this->getRequest()->getParam('sareefinishing');
            $data = array( 'sfinishing' => $sareefinishing, 'layout' => $this->getLayout());
            Mage::dispatchEvent('product_custom_option', $data);
            $jsonData = json_encode(array($blouseoption, $sareefinishing));
            $this->getResponse()->clearHeaders()
             ->setHeader('Content-type','application/json',true);
            $this->getResponse()->setBody(Mage::helper('core')->jsonEncode($jsonData));
            $this->getResponse()->sendResponse();
    }

【问题讨论】:

  • 你提到了一个数据类型为“json”。你确定 ajax 调用正在返回 json 对象,即使它是一个空白对象。这里的 jQuery ajax 期待一个 json 响应。快速检查 put ' text' 而不是 json 作为 dataType 并在调用被打印时运行意味着你遇到了问题。
  • 将您的回复设为error : function(jqXHR,errorThrown,status) {console.log(jqXHR.responseText)}
  • 我添加了返回 json 值的 php 代码。请检查更新。
  • 改了之后这个问题依旧存在?如果是,请按照我之前的评论尝试将 dataType 作为文本而不是 json 并查看调用警报是否打印在控制台上。
  • 所以加载你的调试器并确定错误是什么。这个问题既不包含重现步骤(不,Magento PHP 函数代码转储不计算在内)也不包含具体的问题描述。 -1

标签: javascript jquery ajax


【解决方案1】:

当你使用时

 dataType: "json"

这会将响应评估为 JSON 并返回一个 JavaScript 对象。任何格式错误的 JSON 都会被拒绝并引发解析错误。

这意味着如果服务器返回带有200 OK status 的无效JSON,那么jQuery 会触发错误函数并将textStatus 参数设置为"parsererror"。

确保服务器返回有效的 JSON。空响应也被认为是无效的 JSON;例如,您可以返回 {} 或 null 以验证为 JSON。 尝试检查错误中的 textStatus。

 error : function(jqXHR,textStatus,errorThrown)
   {console.log(textStatus)}

如果这打印出“parsererror”,那么你返回的 json 肯定有问题。请检查一下。

More Info

【讨论】:

  • 我试过error : function(jqXHR,errorThrown,status) {console.log(jqXHR.responseText)},它返回的是空值。
  • error : function(jqXHR,textStatus,errorThrown) {console.log(textStatus)} 打印 error
  • 你在做跨域请求吗?如果是这样,请尝试启用 crossDomain :true
  • @Iceberg:不,我没有做跨域请求。
【解决方案2】:

替代答案

您可以返回状态 204 而不返回任何响应,而不是返回带有空响应的状态 200。状态 204 用于No Content。在这种情况下,JQuery 不应该抛出任何错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-08
    • 1970-01-01
    • 1970-01-01
    • 2014-11-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多