带有JSON的意外标记“:”从节点返回并表达

时间:2017-06-04 22:25:33

标签: javascript json node.js ajax express

我正在使用Node.js和Express构建一个小型Web服务,我遇到了一些问题。一切似乎都运行得很好,直到我真的在浏览器中使用它与Ajax。如果我在Postman中运行它,我会得到:

{
  "status": "ok",
  "data": [
    {
      "GUID": "2f779770-9e1c-415f-9518-ff7fd7d6631c",
      "name": "The Revolver",
      "description": "Rye heavy bourbon, coffee liqueur, orange bitters, orange garnish.",
      "active": 1,
      "categories": [
        "94162f2e-3b2f-4521-a543-068ed6c81011"
      ]
    },
    {
      "GUID": "f05a33ad-e684-4ae0-804c-0c1a61b9945d",
      "name": "Jack Rose",
      "description": "Laird's Applejack, Grenadine, Lemon, Peychaud's bitters, Lemon twist",
      "active": 1,
      "categories": []
    }
  ]
}

标题包括 Content-Type →application/json; charset=utf-8

但是当我进行ajax调用时,Chrome会说“Uncaught SyntaxError:Unexpected token:”

我正在使用res.json({status: "ok", data: result})从Express返回响应。我也试过res.setHeader('Content-Type', 'application/json');而没有运气。

有什么想法吗?

编辑:这是ajax调用:

function getDrinks(){
  $.ajax({
    url: serviceURL + "getDrinks",
    type: "GET",
    dataType: "jsonp",
    success: function(result){
      if (result.status=="ok"){
        var tableHTML=""
        for (var i = 0; i < result.data.length; i++) {
          var drink=result.data[i]
          tableHTML+="<tr><td>"+drink.name+"</td></tr>"
        }
        tableHTML="<table>"+tableHTML+"</table>"
        $("#drinksContainer").html(tableHTML);
      }
    }
  })
}

1 个答案:

答案 0 :(得分:1)

客户端和服务器需要就是否使用JSON或JSON-P达成一致。这两种格式是相关的,但不可互换。

目前,客户端期待JSON-P ......

dataType: "jsonp",

服务器正在使用JSON响应...

res.json({status: "ok", data: result})

对于JSON-P,服务器的响应应包括围绕JSON数据的 Padding ,包括callback名称和括号。

var json = JSON.stringify({status: "ok", data: result});
res.send(req.query.callback + '(' + json + ')');

Express还定义res.jsonp()以简化此操作。

res.jsonp({status: "ok", data: result});

并且,jQuery将为您提供生成的回调名称,通常包括您正在使用的jQuery版本,随机数和时间戳。有了这个,响应应该是这样的:

jQuery32101234567890123456_1496534400000({"status":"ok","data":...});