如何在页面加载时使用 Javascript 发出成功的 Ajax 请求

2023-12-01

我正在开发一个购物车应用程序。用户将向其存储在本地存储中的“购物车”添加商品。当用户导航到将商品添加到购物车的不同页面时,需要使用他们添加到购物车(本地存储)的商品填充该页面。我使用 Handbars 为我的页面构建模板,使用 NodeJS/ExpressJS 创建路由并填充 get/post 请求的页面,并使用 Ajax 向客户端和服务器发送请求以及从客户端和服务器发送请求。

目前,当用户访问查看购物车页面时,我第一次就可以使用它,但是在我收到“错误:发送后无法设置标头”之后立即。这也是以一种相当黑客/糟糕的方式完成的。

首先,这是我用于初始获取查看购物车页面的代码:

viewCart: function(req, res){
  if(req.session.success){
    res.render('base', {title: 'View Cart', userNav: true, checkoutNav: true, viewCart: true, cartIcon: true, js:js});
  }else{
      res.render('base', {title: 'View Cart', userNav: true, viewCart: true, cartIcon: true, js:js});
    }
},

这只是渲染页面,其中没有来自本地存储的数据。 这是我调用的变量的 html,用于填充本地存储中的数据:

  <div id="viewCartTable"></div>

在我的 Javascript 中,我有一个函数,它可以查看 id“viewCartTable”何时存在并执行 ajax 请求:

if(document.getElementById("viewCartTable")){
  var data = localStorage.getItem("Products");
  Ajax.sendRequest("/user/viewCart", function(res){
    responseArr = res.responseText.split('^^^');
    if(responseArr[0] === "error"){
      console.log("error");
      setTimeout(function(){('','#000',false)}, 1500);
    }else if(responseArr[0] === "Success"){
      console.log("Success");
      var tableCart = document.getElementById("viewCartTable");
      tableCart = tableCart.innerHTML = responseArr[1];
    }}, data);
}

此 Ajax 请求被发送到查看购物车页面的帖子,我相信这可能是问题真正展开的地方。他就是这个职位:

viewCartPost: function(req, res){
      var data = JSON.parse(req.body.data);
      console.log(data);
      var keys = Object.keys(data);
      //console.log(keys);
      for(var i = 0; i<keys.length; i++){
        var productId = keys[i];
        Product.find({productId: productId}).select({productId : 1, addProductGroupName: 1, productName: 1, productPrice: 1, productDescription: 1, filePath: 1}).exec(function(err, cartProducts){
        if(err){
          console.log(err);
          res.send("error");
        }else{
          res.send("Success^^^"+cartProducts);
        }
        });
        console.log(productId);
      }
    },

这是获取客户端发送过来的本地存储的信息,找到本地存储中存储和发送的与productId匹配的产品及其信息。

所以当前的设置第一次就可以工作。首次访问页面会打印本地存储中的商品数据,并向前端发送“成功”。但是在设置标题后立即给出 Cant set headers。我相信这是因为当我找到“viewCartTable”的 id 时,我正在发送 Ajax 请求。因此必须有更好的方法来触发ajax请求并将数据发送到服务器和从服务器发送回客户端。

有没有更好的方法来发出 Ajax 请求来获取所需的数据?到目前为止,加载和加载都让我的尝试失败了。任何帮助表示赞赏。谢谢。

Part 2

迭代数据并以表格格式打印。因此,在服务器端,我正在获取此函数的结果:

viewCartPost: function(req, res){
      var data = JSON.parse(req.body.data);
      console.log(data);
      var keys = Object.keys(data);
      //console.log(keys);
      var promises = [];
      for(var i = 0; i<keys.length; i++){
        var productId = keys[i];
        promises.push(Product.find({productId: productId}).select({productId : 1, addProductGroupName: 1, productName: 1, productPrice: 1, productDescription: 1, filePath: 1}).exec());
      }
      Promise.all(promises).then(function(results) {
          // you may have to reorganize results to be exactly what you want
          // to return to the client
          var cartTable = viewCartTable(results);
          res.send("Success^^^"+cartTable);
      }).catch(function(err){
          res.sendStatus(500);
      });
    },

并将其发送到正在构建该函数结果表的函数:

function viewCartTable(results){
  console.log(results[0]);
}

现在这个函数只是查看第一个结果。这是 1 个特定产品的整个数据集。看起来像这样:

[ { _id: 583df3eead025434e61a2172,
    filePath: '/public/images/df54528a827f99586135956e45f045fe.jpg',
    addProductGroupName: 'Xbox One',
    productName: 'Far Cry',
    productPrice: 78.34,
    productDescription: 'Its back again. I have never played this game but heard it is pretty good. Wanted to write an extra long description to see if someone really took the time to type such a longer sentence how exactly it would appear on things throughout the application.',
    productId: 'rJUg4uiGl' } ]

在我构建这样的表的所有其他实例中,我都能够调用 results[0].productId 来获取结果的特定 ProductId。在这里,它返回一个未定义的。所有其他尝试也返回未定义。知道如何轻松迭代该数据集的每个部分吗?我觉得我对此很愚蠢,因为我无法弄清楚这一点:(


该服务器代码是错误的:

viewCartPost: function(req, res){
      var data = JSON.parse(req.body.data);
      console.log(data);
      var keys = Object.keys(data);
      //console.log(keys);
      for(var i = 0; i<keys.length; i++){
        var productId = keys[i];
        Product.find({productId: productId}).select({productId : 1, addProductGroupName: 1, productName: 1, productPrice: 1, productDescription: 1, filePath: 1}).exec(function(err, cartProducts){
        if(err){
          console.log(err);
          res.send("error");
        }else{
          res.send("Success^^^"+cartProducts);
        }
        });
        console.log(productId);
      }
    },

你有res.send("Success^^^"+cartProducts);里面一个for环形。这意味着您多次调用它。这意味着您尝试为此请求发送多个响应,这会触发您看到的错误。这是错误的服务器代码。对于任何给定的请求,您只需发送一个响应。

在我建议什么代码最能解决这个问题之前,我必须先了解所需的单一响应是什么。如果您打算执行多个像这样的异步操作,并且想知道所有这些操作何时完成,那么您必须编写代码来跟踪它们并在它们全部完成时收到通知,然后发送一个且仅一个响应。

这可以使用计数器和一些代码来手动完成,以递增和检查计数器,也可以通过切换到使用 Promise 来跟踪异步操作并使用更易于管理的方式来完成Promise.all()当所有异步操作完成时通知您。

当您在此功能中有多个键时,想要发送的单个响应是什么?


我自己不太了解猫鼬,但是.exec()在 mongoose 的最新版本中,返回一个承诺,因此我们可以使用它来协调多个异步数据库操作,如下所示:

viewCartPost: function(req, res){
      var data = JSON.parse(req.body.data);
      console.log(data);
      var keys = Object.keys(data);
      //console.log(keys);
      var promises = [];
      for(var i = 0; i<keys.length; i++){
        var productId = keys[i];
        promises.push(Product.find({productId: productId}).select({productId : 1, addProductGroupName: 1, productName: 1, productPrice: 1, productDescription: 1, filePath: 1}).exec());
      }
      Promise.all(promises).then(function(results) {
          // you may have to reorganize results to be exactly what you want 
          // to return to the client
          res.json(results);              
      }).catch(function(err){
          console.error("viewCartPost", err);
          res.sendStatus(500);       
      });
    },
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在页面加载时使用 Javascript 发出成功的 Ajax 请求 的相关文章

随机推荐

  • Z3 4.3.1 C-API parse_smtlib2_string:从哪里获取声明?

    不幸的是 我没有足够的声誉来评论其他问题的答案 所以我必须开始一个新问题 基本上我有与描述相同的问题here 我想使用 Z3 进行增量求解 为了将约束引入 Z3 我使用 smtlib2 字符串 对于第一组约束 一切正常 我可以将变量等的声明
  • 用于打印文本文件中搜索字符串的上一行和下一行的批处理脚本

    我有一个批处理脚本 它将把搜索字符串的整行打印到文本文件中 for i in log txt do FINDSTR G pattern txt i gt gt output txt 例子 pattern txt 包含搜索字符串ERROR下面
  • 发推文,不使用推文表

    我使用下面的代码来分享内容 来自UITextView UIImageView 通过推特 void shareViaTweet NSString shareMessage if SLComposeViewController isAvaila
  • Java 6 JVM 挂起

    对于这么长的帖子 我深表歉意 但我想知道在向 Sun 提交错误报告之前是否可以吸引更多人的关注 虚拟机 6u11操作系统 Windows XP SP3硬件 AMD Athlon 64 X2 4600 2 41GHz 配备 3 25 GB R
  • CollapsingToolbarLayout 副标题

    我可以设置标题吗CollapsingToolbarLayout通过setTitle方法 还有设置字幕的方法吗 如果你想让字幕转到Toolbar当 的时候AppBar已完全折叠 您应该创建您的自定义CoordinatorLayout Beha
  • 缺少 libmmal.so 和 picamera 库

    使用 pip 安装 picamera 库后 每当我导入该库时 都会收到此错误 OSError libmmal so cannot open shared object file No such file or directory 我正在运行
  • 如何本地化alloyui调度程序组件?

    我正在尝试将 Alloyui 调度程序完全本地化为法语 继这篇文章之后 如何获取 YUI 3 或 AlloyUI 组件的本地化版本 工作快完成了 但是我仍然缺少两件事的提示 我需要将左栏中的时间格式从 1 12am pm 更改为 1 24
  • html,css - 图片下方奇怪的隐形边距

    我在这里疯了 不知何故 在我页面中的所有图像下方有一个间隙 代码中不存在的边距 即使 Firebug 也看不到它 但 Firefox 和 Safari 正在渲染它 即使根本没有 CSS 这以前从未发生在我身上
  • 进行 GameCenter 身份验证的正确方法是什么?

    我在有关堆栈溢出的帖子中看到过 其中显示了处理 GameCenter 身份验证的片段 然而 这些解决方案都不能解决现实世界用例所涉及的任何问题 也就是说 GKLocalPlayer localPlayer authenticateHandl
  • 使用 Ajax 检查 WooCommerce 结帐中的现有电子邮件

    我正在尝试检查 WooCommerce 结账中 billing email 字段的插入值 以了解它是否存在 这是functions php中的代码 add action wp enqueue scripts live validation
  • JOIN 结果长度超过 50,000 个字符的限制

    我正在尝试组合 A 列中的文本并将其与 B 列的每种可能性相匹配 我使用了以下公式 in C1 transpose split join arrayformula rept filter A1 A len A1 A char 9999 co
  • OpenMP set_num_threads() 不起作用

    我正在使用 C 中的 OpenMP 编写并行程序 我想使用控制程序中的线程数omp set num threads 但它不起作用 include
  • Fortran 中的大实数运算

    我编写了一个 Fortran 代码来计算给定列表的第 i 次排列 1 2 3 n 无需计算所有其他的 即n 我需要它来找到 TSP 旅行推销员问题 的第 i 条路径 When n 很大 代码给了我一些错误 我测试发现找到的第 i 个排列不是
  • circular_buffer 和 Managed_mapped_file 分段错误

    我正在使用 boost 1 73 0 并尝试将circular buffer 与manage mapped file 一起使用以将字符串存储在磁盘上持久存在的循环缓冲区中 我执行以下操作来创建 打开circular buffer boost
  • 如何找到不同 numpy 数组中两点之间的距离?

    这是针对 K 均值算法的 这是为了家庭作业 所以我不想使用 内置 Kmeans 函数 我有 2 个 numpy 数组 一种是质心 另一个是数据点 我试图找到从每个质心到每个数据点的距离 我不知道如何将数组传递给我的函数以使其打印 我想结束
  • JavaScript 中的保留字列表

    有没有比这个更完整的列表莫斯拉的关于保留字 它缺少像这样的词解析浮点型 toString 原型 etc parseFloat toString and prototype are not保留字 仅仅因为它们有时具有特殊含义 并不意味着您不能
  • 使用 Pandas 与 DataFrame 合并时出现 ValueError

    我正在尝试使用 Pandas 合并三个 DataFrame 为什么我会收到此错误消息 ValueError DataFrame 的真值不明确 使用 a empty a bool a item a any 或 a all 这是代码 df pd
  • 如何在给定(一条线上的两个点)和(从第三点到第一点的距离)的情况下找到第三点

    给定 一条线上的两个点 和 第三点到第一点的距离 如何找到第三点 语言 Visual Basic 2012 第三点与第二点在同一条线上 并且可能更接近第一点 也可能更接近第二点 这是一个可以处理两者 来自数据数组 的函数 奇怪的是 我似乎无
  • SQL 从一张表的字段更新另一张表的字段

    我有两张桌子 A ID column1 column2 column3 B ID column1 column2 column3 column4 A将永远是子集B 意味着所有列A也在B 我想用特定的内容更新记录ID in B他们的数据来自A
  • 如何在页面加载时使用 Javascript 发出成功的 Ajax 请求

    我正在开发一个购物车应用程序 用户将向其存储在本地存储中的 购物车 添加商品 当用户导航到将商品添加到购物车的不同页面时 需要使用他们添加到购物车 本地存储 的商品填充该页面 我使用 Handbars 为我的页面构建模板 使用 NodeJS