有时没有将对象添加到Mongodb集合中

时间:2019-01-17 03:42:16

标签: jquery mongodb express

我有一些其他人编写的代码,这是一个使用动态呈现列表的jquery函数,单击按钮后应该通过express将对象提交给mongo集合。

该功能在本地可用,当我推送到heroku后,它对我有用。但是,同事无法使用Google chrome或safari来使按钮单击工作,该页面只是刷新而未添加该对象。我相信我已经重现了问题,但仅限于MS Edge。

这是jquery函数:

function OnAddProxyClick() {
let proxies = [];

const checkboxes = $('.proxy-input:checked');

for (const checkbox of checkboxes) {
  proxies.push({
    proxyTitle: checkbox.getAttribute('data-title'),
    proxyValue: checkbox.getAttribute('data-value'),
    proxyUnit: checkbox.getAttribute('data-unit')
  });
}
//fetch returns a promise, handle it with .then and check the response to do error handling
//otherwise if all goes well we should redirect
const url = window.location.pathname + '/proxies';
fetch(url, {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
  },
  redirect: 'follow',
  body: JSON.stringify({ proxies: proxies })
}).then(res => {
  if (res.ok) {
    location.reload();
  } else {
    //show an error here if adding proxy doesn't work
    console.log('The proxy wasnt added')
  }
});
}

如果我删除location.reload并使页面挂起,则可以console.logged正确的对象,但不会将其添加到集合中。

这是快递代码:

router.post("/:id/proxies", async (req, res) => {
let newProxies = [];
for (const proxy of req.body.proxies) {
  newProxies.push({
    proxyTitle: proxy.proxyTitle,
    proxyValue: proxy.proxyValue,
    proxyUnit: proxy.proxyUnit,
  });
}
// Add every new proxy to the project proxies array
const query = { _id: req.params.id };
const update = { $addToSet: { proxies: { $each: newProxies } } };

const project = await Project.findById(query);

//make sure we don't add a duplicate
for (const newProxy of newProxies) {
  let shouldPush = true;
  for (const proxy of project.proxies) {
    if (
      proxy.proxyTitle == newProxy.proxyTitle &&
      proxy.proxyValue == newProxy.proxyValue &&
      proxy.proxyUnit == newProxy.proxyUnit
    ) {
      shouldPush = false;
      break;
    }
  }

  if (shouldPush) {
    // have tried awaiting this
    project.proxies.push(newProxy);
  }
}
await project.save();

res.end();
 }
);

'update'变量似乎在那里检查mongo,以确定对象是否存在于集合中但未被使用(我尝试使用它但没有帮助),并且我尝试在项目上使用await。 proxies.push,但这也不起作用。我在Edge工具中发现的唯一错误是关于一个不匹配的标签的问题,但这不能解释为什么它在chrome中对我有用,但对我的同事却不起作用。

如何确保在重新加载页面之前将对象实际添加到集合中?

1 个答案:

答案 0 :(得分:0)

我认为您应该将快速代码更改为此,这样会更有效率。

router.post("/:id/proxies", async (req, res) => {
    // req.body.proxies contains the array that needs to be pushed in the proxies array 
    // addToSet makes sure that the elements are not repeated   
    await Project.findByIdAndUpdate(req.params.id, { $addToSet: { proxies: req.body.proxies } });
    res.end();
});