необработанная ошибка catch в обещании, у которого есть catch - Nodejs - PullRequest
0 голосов
/ 09 февраля 2020

У меня есть функция, которая ПОЛУЧАЕТ данные из кэша redis или mongodb или azure. Я пытаюсь установить его так, чтобы он сначала проверял кеш, а затем нажимал на mongodb, если кеш пустой, но по какой-то причине сначала выполняется код mongodb. Я создал обещание для обработки заказа, но оно дает мне необработанную ошибку отклонения обещания. У меня есть улов, поэтому я не понимаю, в чем проблема. Я ценю любую помощь!

консольный вывод


SETTING TRUE...
(node:27068) UnhandledPromiseRejectionWarning: Cache found
(node:27068) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise
which was not handled with .catch(). (rejection id: 1)
(node:27068) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero
exit code.

GET-запрос



  const promise = new Promise((resolve, reject) => {
      client.get("directory", (err, reply) => {
        if (reply !== null) {
          console.log("SETTING TRUE...");
          redisReply = true;

          replyConverted = JSON.parse(reply);

          res.status(200).json({
            message: "Directory retrieved successfully!",
            posts: replyConverted,
            maxPosts: replyConverted
          });
          reject("Cache found);
        } else {
          resolve();
        }
      });
    }).then(res => {
      const postPerPage = 20;
      console.log("directory ID SECTION");

      var searchKey = new RegExp(req.query.keyword, "i");

      console.log("req.query.currentPage");
      console.log(req.query.currentPage);
      console.log(req.query.keyword);
      let currentPage = req.query.currentPage;

      console.log("REDIS RELY IS " + redisReply);
      console.log("GRABBING FROM COSMOSDB");
      User.countDocuments({
        $and: [{ username: searchKey }, { role: "Seller" }]
      })
        .then(docs => {
          console.log("COUNT");
          console.log(docs);
          let totalPosts = docs;
          User.find({
            $and: [{ username: searchKey }, { role: "Seller" }]
          })
            .select("_id username")
            .skip(postPerPage * (currentPage - 1))
            .limit(postPerPage)
            .then(documents => {
              res.status(200).json({
                message: "Directory retrieved successfully!",
                posts: documents,
                maxPosts: totalPosts
              });

              let docsString = JSON.stringify(docs);
              client.set("directory", docsString, (err, reply) => {
                console.log(reply);
              });
            });
        })
        .catch(err => {
          console.log("Skipped Mongodb");
        });

1 Ответ

1 голос
/ 09 февраля 2020

Вы можете создать функцию для первого поиска в кеше, если он найден, использовать его, если не выполните запрос, а затем выполнить обратный вызов с результатом. В вашем случае это может выглядеть примерно так, также вы можете сделать так, чтобы ключ Dynami c соответствовал вашему запросу

module.exports.findDirectory = function(client,query, callback){
    client.get(query, (err, reply) => {
     if (err) {
       callback(null);
    } else if(reply){

    callback(JSON.parse(reply));

    } else {
    User.countDocuments({
            $and: [{ username: query.searchKey }, { role: "Seller" }]
          })
            .then(docs => {
              console.log("COUNT");
              console.log(docs);
              let totalPosts = docs;
              let postsPerPage = 9;
              User.find({
                $and: [{ username: query.searchKey }, { role: "Seller" }]
              })
                .select("_id username")
                .skip(postPerPage * (query.currentPage - 1))
                .limit(postPerPage)
                .then(documents => {


         let docsString = JSON.stringify(docs);
         client.set(query, docsString, (err, reply) => {
                    console.log(reply);
                    callback(docs)
           });
       });
    }

  })

}

, а затем использовать его в маршруте, подобном этому

dirsController.findDirectory(client,req.query,function(dirs){

   res.send(dirs)
}
...