我有一些其他人编写的代码,这是一个使用动态呈现列表的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中对我有用,但对我的同事却不起作用。
如何确保在重新加载页面之前将对象实际添加到集合中?
答案 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();
});