Javascript 错误:AJAX响应中的AJAX调用

Javascript 错误:AJAX响应中的AJAX调用,javascript,jquery,json,ajax,post,Javascript,Jquery,Json,Ajax,Post,我正在使用一个与API交互的文件。首先,API发送一些HTML和Javascript来创建搜索表单,然后API可以处理该搜索表单的查询 我的第二个请求遇到了一些问题,在第一个请求的success函数中调用了第二个请求(这似乎就是问题所在!)。这是我正在使用的代码 $.ajax({ type: "POST", url: "https://vq3rsgkd94.execute-api.us-east-1.amazonaws.com/deploy", crossDomain: true,

我正在使用一个与API交互的文件。首先,API发送一些HTML和Javascript来创建搜索表单,然后API可以处理该搜索表单的查询

我的第二个请求遇到了一些问题,在第一个请求的success函数中调用了第二个请求(这似乎就是问题所在!)。这是我正在使用的代码

$.ajax({
  type: "POST",
  url: "https://vq3rsgkd94.execute-api.us-east-1.amazonaws.com/deploy",
  crossDomain: true,
  data: JSON.stringify({
    "stage": "load",
    "fields": ["first_name", "last_name", "graduation_year"]
  }),

  success: function(response) {
    response = JSON.parse(response);
    $(response.html).prependTo("#content");
    $(response.scripts).appendTo("body");
  },

  complete: function() {
    //get field inputs
    var fieldInput = {
      "first_name_query": "",
      "last_name_query": "",
      "graduation_year_query": ""
    };

    $('form').find('input[type=search]').each(function(index, value) {
      var variableName = value.name;
      var fieldId = "#" + value.name;

      $(fieldId).keyup(function() {
          variableName = $(this).val();
          fieldInput[value.name + "_query"] = variableName
          console.log(value.name + ":" + fieldInput[value.name + "_query"]);
        })
        .keyup();
    });

    $('#search_form').submit(function(event) {
      event.preventDefault();
      $.ajax({
        type: "POST",
        url: "https://vq3rsgkd94.execute-api.us-east-1.amazonaws.com/deploy",
        data: JSON.stringify({
          "stage": "search",
          "fields": ["first_name", "last_name", "graduation_year"],
          "query": {
            "first_name": fieldInput["first_name_query"]
          }
        }),

        success: function(response) {
          response = JSON.parse(response);
          console.log(response);
        }
      });

    })

  }
});
当试图解析响应时,我得到了意外的标记:o。如果我在第一个ajax请求之外运行此代码,如下所示:

$.ajax({
  type: "POST",
  url: "https://vq3rsgkd94.execute-api.us-east-1.amazonaws.com/deploy",
  data: JSON.stringify({
    "stage": "search",
    "fields": ["first_name", "last_name", "graduation_year"],
    "query": {
      "first_name": "Bob"
    }
  }),


  success: function(response) {
    response = JSON.parse(response);
    console.log(response);
  }
});  

我没有任何问题,代码执行正常。所以问题似乎是在另一个成功响应中运行一个Ajax调用,但我不知道为什么?我可能可以用另一种方式来做,但我想看看是否有人了解为什么这样做不起作用。

您收到的错误表明您正在尝试使用JSON解析对象。parse 自


您收到的错误表明您正在尝试使用
JSON.parse来解析对象
自


所以这个问题最终变得很奇怪。我正在为Nationbuilder平台开发一个API(可能是我的第一个错误)。出于未知的原因,Nationbuilder将真实性令牌附加到任何请求中,而我基于LAMBDA的API无法解析该请求。为了防止其他人和我在同一条非常小的船上,我最终使用GET请求而不是POST请求,并且Nationbuilder停止附加真实性令牌


此外,如果有人在使用Lambda,我最终会切换到Digital Ocean托管的Express JS,我会更开心。

因此问题变得非常奇怪。我正在为Nationbuilder平台开发一个API(可能是我的第一个错误)。出于未知的原因,Nationbuilder将真实性令牌附加到任何请求中,而我基于LAMBDA的API无法解析该请求。为了防止其他人和我在同一条非常小的船上,我最终使用GET请求而不是POST请求,并且Nationbuilder停止附加真实性令牌


此外,如果有人在使用Lambda,我最终选择了Digital Ocean托管的Express JS,我会更开心。

为什么不呢?-如果它是JSON,jQuery将使它成为一个对象……为什么不进行委托绑定呢?-如果是JSON,jQuery将使其成为一个对象……实际上,当我设置断点并执行console.log(response)时,我会得到对象{errorMessage:“意外标记&”,errorType:“SyntaxError”,stackTrace:Array[0]},如果执行console.log(response.toString()),我会得到[object object],这解释了我最初的错误。我尝试设置数据类型:“json”,但没有任何更改。我建议您对html和代码进行修改。这将更好地帮助人们理解你的问题我做了一个密码笔,密码笔工作了。。。这意味着这与Nationbuilder网站有关,因此我将不得不跟进他们。感谢您的帮助。实际上,当我设置断点并执行console.log(response)时,我会得到对象{errorMessage:“意外令牌&”,errorType:“SyntaxError”,stackTrace:Array[0]},如果执行console.log(response.toString()),我会得到[Object Object],这解释了我最初的错误。我尝试设置数据类型:“json”,但没有任何更改。我建议您对html和代码进行修改。这将更好地帮助人们理解你的问题我做了一个密码笔,密码笔工作了。。。这意味着这与Nationbuilder网站有关,因此我将不得不跟进他们。谢谢你的帮助。我和你在同一条很小的船上。这是多么奇怪的事啊。建国者一点帮助都没有,我帮了!因此Nationbuilder使用液体模板引擎,每个页面中都包含一个缩小的文件。此页面包含一个AJAX事件处理程序,它绑定到jQuery提供的
beforeSend
。此事件处理程序检测请求是查询字符串还是对象,并将“有益地”尝试将真实性令牌作为属性分别附加或添加到请求中。但是,这种检查是幼稚的:当您将JSON对象字符串化为请求主体时,这会发生在调用
beforeSend
事件之前。因此,在检查发生时,您的(1/2)…主体现在是一个字符串。此事件处理程序错误地假定任何字符串都是查询字符串的形式。这就是为什么将真实性标记作为查询字符串附加到对象中的原因。解决方案是什么?jQuery的$.ajax对象包含一个选项
global
,该选项防止事件处理程序附加到请求-这避开了附加的真实性令牌。将
global
设置为
true
:)我和你在同一条非常小的船上。这是多么奇怪的事啊。建国者一点帮助都没有,我帮了!因此Nationbuilder使用液体模板引擎,每个页面中都包含一个缩小的文件。此页面包含一个AJAX事件处理程序,它绑定到jQuery提供的
beforeSend
。此事件处理程序检测请求是查询字符串还是对象,并将“有益地”尝试将真实性令牌作为属性分别附加或添加到请求中。但是,这种检查是幼稚的:当您将JSON对象字符串化为请求主体时,这会发生在调用
beforeSend
事件之前。因此,在检查发生时,您的(1/2)…主体现在是一个字符串。此事件处理程序错误地假定任何字符串都是查询字符串的形式。这就是为什么将真实性标记作为查询字符串附加到对象中的原因。解决方案是什么?jQuery的$.ajax对象包含一个选项
global
,该选项防止事件处理程序附加到请求-这避开了附加的真实性令牌。将
global
设置为
true
:)(2/2)
var x = {}
console.log(x.toString()) //> [object Object]
JSON.parse(x)
// Uncaught SyntaxError: Unexpected token o in JSON at position 1
//    at JSON.parse (<anonymous>)
//    at <anonymous>:3:6
$.ajax({
  type: "POST",
  url: "https://vq3rsgkd94.execute-api.us-east-1.amazonaws.com/deploy",
  data: JSON.stringify({
    "stage":"search",
    "fields":["first_name","last_name","graduation_year"],
    "query":{"first_name": fieldInput["first_name_query"] }
  }),
  dataType: 'json'
)}