来自Safari Extension的Ajax JSONP Express parseError

时间:2013-03-27 15:28:51

标签: ajax safari express jsonp

首先,我在这里阅读了很多帖子,但在我自己的代码中没有找到问题,包括这个问题$.ajax and JSONP. ParseError and 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的TON,但我的眼睛显然很黯淡。点击我的高跟鞋三次也没有帮助。

线索?谢谢!

1 个答案:

答案 0 :(得分: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"}
  });
});