首页 > 解决方案 > document.querySelectorAll.forEach 奇怪的行为

问题描述

我有一小段代码可以手动获取选中复选框的值并通过套接字 io 发出。问题是,如果我注释掉payload.permission.subscriptionPlans.push(item.value);它可以正常工作,但如果我取消注释它,socket.emit 仍然运行,我仍然可以获得服务器端所需的所有数据,没有任何错误,但它不运行回调函数。这是代码:

let payload = {
  permission: {},
};

payload.permission.subscriptionPlans = [];

document.querySelectorAll(".form-add-sub-plan:checked").forEach((item) => {
  console.log(item.value); // this still works
  payload.permission.subscriptionPlans.push(item.value); // problem here
});

socket.emit("admin/manage-permission/create", payload, (res) => {
  let addModal = bootstrap.Modal.getOrCreateInstance(document.getElementById("add-permission-modal"));

  addModal.hide();

  table.reload();

  table.displayMessage(res.payload.type, res.payload.message);
});
// server code
socket.on("admin/manage-permission/create", async(req, done) => {
  try {
    if (await Permission.exists({
        url: req.permission.url
      })) {
      return done(
        new SocketPayload("error", 409, {
          type: "danger",
          message: "Url already exists",
        })
      );
    }

    let newPermission = new Permission(req.permission);

    // console.log(newPermission);
    await newPermission.save();

    return done(
      new SocketPayload("success", 200, {
        type: "success",
        message: "New permission was added",
      })
    );
  } catch (e) {
    console.log(e);

    return done(
      new SocketPayload("error", 500, {
        type: "danger",
        message: "An error occured",
      })
    );
  }
});

任何想法为什么会发生这种情况?编辑:如果有人想知道,添加服务器代码

标签: javascripthtmlsocket.io

解决方案


原来是猫鼬中间件停止套接字返回回调。我花了一段时间才弄明白,因为服务器没有抛出任何错误。


推荐阅读