API возвращает старое значение, можно ли улучшить этот процесс? - PullRequest
0 голосов
/ 07 мая 2020

У меня есть топор ios вызов моего mongoose / express server buy, когда я обновляю некоторую информацию из reactjs веб-клиента, код useEffect снова вызывает вызов, поэтому я могу обновлять состояния своих компонентов везде, но все еще извлекаю старые данные. можно ли улучшить этот процесс, чтобы я мог получать правильную информацию? Реализация GraphQL кажется намного быстрее, потому что возвращает правильную информацию. но мне не удалось выполнить разбиение на страницы с помощью graphQL, поэтому на данный момент я покрываю эту часть обычным Ax ios.

Сторона сервера:

function paginatedItemsResults(model) {
  return async (req, res, next) => {
    const page = parseInt(req.query.page);
    const limit = parseInt(req.query.limit);

    const startIndex = (page - 1) * limit;
    const endIndex = page * limit;

    const results = {};

    if (endIndex < (await model.countDocuments())) {
      results.next = {
        page: page + 1,
        limite: limit,
      };
    }

    if (startIndex > 0) {
      results.previous = {
        page: page - 1,
        limite: limit,
      };
    }
    results.total = await model.countDocuments().exec();

    try {
      results.results = await model
        .find()
        .sort([["date", -1]])
        .limit(limit)
        .skip(startIndex)
        .exec();
      res.paginatedItemsResults = results;
      next();
    } catch (e) {
      res.status(500).json({ message: e.message });
    }
  };
}

app.get("/itemspagination", paginatedItemsResults(Items), (req, res) => {
  res.json(res.paginatedItemsResults);
});

Клиентская сторона:

useEffect(() => {
    let isSubscribed = true;
    const fetchProducts = async () => {
      setLoading(true);
      try {
        const res = await axios.get(
          "https://**********/itemspagination?page=" +
            currentPage +
            "&limit=" +
            limitOfItemsByPage
        );
        if (isSubscribed) {
          dispatchPagination(
            buildItemPaginationAction({
              id: "next",
              value: res.data.next
                ? res.data.next.page
                : res.data.previous.page + 1,
            })
          );
          dispatchPagination(
            buildItemPaginationAction({
              id: "previous",
              value: res.data.previous ? res.data.previous.page : 1,
            })
          );
          dispatch(
            buildItemPaginationAction({
              id: "next",
              value: res.data.next
                ? res.data.next.page
                : res.data.previous.page + 1,
            })
          );
          dispatch(
            buildItemPaginationAction({
              id: "previous",
              value: res.data.previous ? res.data.previous.page : 1,
            })
          );
          setActualItems(res.data.results);
          setTotalProducts(res.data.total);
          setLoading(false);
        }
      } catch (error) {
        console.log(error);
      }
    };

    fetchProducts();
    return () => (isSubscribed = false);
  }, [currentPage, dispatch, limitOfItemsByPage, newItem, updateItem]);

1 Ответ

0 голосов
/ 07 мая 2020

Проблема может быть связана с кешированием. Попробуйте добавить новый параметр GET к своему URL-адресу, например:

const res = await axios.get(
      "https://**********/itemspagination?page=" +
        currentPage +
        "&limit=" +
        limitOfItemsByPage + "&nocache=" + (new Date).getTime()
    );
...