используя API выборки с NodeJS (express) - PullRequest
1 голос
/ 02 августа 2020

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

Информация о стеке : MongoDB , NodeJS (Express), Vanilla JS для внешнего интерфейса.

Я использую API извлечения на стороне клиента и обещания на стороне сервера.

Что я здесь делаю:

Я беру значение из входного элемента и затем вызываю AJAX маршрут, который проверяет базу данных на значение . Если база данных возвращает некоторые данные, это означает, что имя пользователя уже занято, если данные не возвращены, тогда оно доступно для использования.

Сообщение об ошибке, которое я получаю, ==>

(node:1697) UnhandledPromiseRejectionWarning: username already in use
(node:1697) 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:1697) [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.

Это маршрут и связанная функция:

app.get("/api/check/:username", (req,res)=>{
    checkDuplicate(req,res);
});
function checkDuplicate(req, res) {
    return new Promise(function(resolve, reject){
        User.findOne({username: req.params.username}, function(err, data){
            //no data found, username availabe
            if(!data){
                resolve();
            //database error
            }else if(err){
                reject("some error occurred");
            //data found, user already exist
            }else{
                reject("username already taken");
            }
        });
    });
}

это внешний интерфейс javascript код:

fetch(`/api/check/${username.value}`)
            .then(showMessage("username Availabe, you are ready to go"))
            .catch(err => showMessage(err, true));

PS: это первый раз, когда я использую такие вызовы AJAX, а также я новичок в обещаниях и, вероятно, не совсем понимаю их.

1 Ответ

1 голос
/ 02 августа 2020

, вы должны использовать блок try-catch в express, так как все ошибки должны обрабатываться вручную. попробуйте заменить блок

app.get("/api/check/:username", async (req,res,next)=>{
try {
   const result = await checkDuplicate(req,res);
    res.send(result);
  } catch (err) {
    next(err);
  }
});

, поскольку я вижу, что вы хотите отклонить ошибку и передать ее во внешний интерфейс, который у вас есть, обработайте его, как

app.get("/api/check/:username", async (req,res,next)=>{
    try {
       const result = await checkDuplicate(req,res);
        res.send(result);
      } catch (err) {
        res.send(err);
      }
    });

, есть много методов статуса ответа и отправки вы можете проверить и использовать соответственно

...