Объект не добавляется в коллекцию Mongodb, иногда - PullRequest
0 голосов
/ 17 января 2019

У меня есть некоторый код, написанный кем-то другим, это функция jquery, которая принимает динамически отображаемый список, и при нажатии кнопки предполагается передать объект в коллекцию Монго через экспресс.

Функциональность работает локально, и она сработала у меня после того, как я толкнул геройку. Однако коллега не смог заставить работать кнопку, используя Google Chrome или Safari, страница просто обновилась, и объект не был добавлен. Я полагаю, что я воссоздал проблему, но только в краю MS.

Это функция 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 для проверки того, существует ли объект в коллекции, но не используется ли он (я пробовал использовать его, но это не помогло), и я попытался использовать await в проекте. proxies.push, и это тоже не сработало. Единственная ошибка, которую я могу найти в инструментах Edge, это что-то из-за непревзойденного тега, но это не объясняет, почему он работает для меня в Chrome, а не для моего коллеги.

Как мне убедиться, что объект действительно был добавлен в коллекцию до перезагрузки страницы?

1 Ответ

0 голосов
/ 17 января 2019

Я думаю, вы должны изменить экспресс-код на это, это будет намного эффективнее.

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();
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...