0

首先,我在这里阅读了很多帖子,但在我自己的代码中没有发现问题,包括这个$.ajax 和 JSONP。ParseError 和 Uncaught SyntaxError: Unexpected token :

我正在构建一个 Safari 扩展,需要发布/获取到我的服务器并处理响应。Safari 抛出此错误:

SyntaxError: Unexpected token ':'

和这条消息

"handle was not called"

其中 'handle' 是此扩展代码中的回调:

var server="http://localhost:3001/api/login";
$.ajax({
       type : "GET",
       url :  server,
       data: {"something" : "else"}
       dataType: 'jsonp',
       jsonp:false,
       jsonpCallback: 'handle',
       success: function(data, text){
        var json = $.parseJSON(data);
        console.log(json)
       },
       error: function (request, status, error) {
        console.log(error );
       }  
});

Express.js (2.5.5) 代码是:

//in the config
app.set( "jsonp callback", true )

app.all('/', function(req, res, next){
  res.header("Access-Control-Allow-Origin", "*");
  res.header("Access-Control-Allow-Headers", "X-Requested-With");
  next();
});

app.get('/api/login', function(req, res){
res.json(
  {
    "success": {"that":"this"}
  }
);
});

注意:我尝试过 res.jsonp、设置内容类型等,但响应相同。在这个过程中,我学到了很多关于 CORS 和 Ajax 的知识,但我的眼睛显然很模糊。点击我的高跟鞋三下也没有帮助。

线索?谢谢!

4

1 回答 1

2

通过设置dataType: 'jsonp',它已经为您解析了 JSON。jsonp: true是不正确的。这个组合应该有效:

JSONP

$.ajax({
   url : "http://localhost:3001/api/login",
   data: {"something" : "else"},
   dataType: 'jsonp',
   success: function(data){
     // It is already an object, don't parse it again.
     console.log(data)
   },
   error: function (request, status, error) {
     console.log(error );
   }  
});

app.get('/api/login', function(req, res){
  res.jsonp({
    "success": {"that":"this"}
  });
});

// Remove this:
app.set( "jsonp callback", true )

CORS 浏览器和 JSON:

$.ajax({
   url : "http://localhost:3001/api/login",
   data: {"something" : "else"},
   dataType: 'json',
   success: function(data){
     // It is already an object, don't parse it again.
     console.log(data)
   },
   error: function (request, status, error) {
     console.log(error );
   }  
});

// This is 'app.use', not 'app.all'.
app.use('/', function(req, res, next){
  res.header("Access-Control-Allow-Origin", "*");
  res.header("Access-Control-Allow-Headers", "X-Requested-With");
  next();
});

app.get('/api/login', function(req, res){
  res.json({
    "success": {"that":"this"}
  });
});
于 2013-03-27T15:35:09.463 回答