node.js, MongoDB - функциональность асинхронности и ожидания не работает должным образом в функции findOne () - PullRequest
0 голосов
/ 28 октября 2018

Я относительно новичок в node.js и MongoDB, поэтому извините заранее, если это очевидный ответ.

Я пытаюсь создать логику для проверки объекта, который передается, ноЯ испытываю затруднения с использованием асинхронного режима и ожидаю правильного определения времени.По сути, я буду передавать строку и пытаюсь выяснить, существует ли какая-либо запись в БД, которая существует с этой строкой.Если нет, то errors возвращает пустое значение, а если есть, то errors содержит в себе что-то.Вот соответствующие части моего кода:

Схема (../models/FriendRequest):

var mongoose = require('mongoose');
var Schema = mongoose.Schema;

var friendRequestSchema = new Schema({
    requestFrom: {type: String, required: true},
    requestTo: {type: String, required: true},
});

module.exports = mongoose.model('FriendRequest', friendRequestSchema);

Логика:

var FriendRequest = require('../models/FriendRequest');

async function checkForDuplicateRecord(requestTo) {
    let errors = "";

    // do not allow duplicate requests
    FriendRequest.findOne({
        requestTo: requestTo
    }, (err, record) => {
        if (err) {
            errors += "{'\n'}Server Errors.";
        } else if (record) {
            errors += "{'\n'}You have already sent this person a friend request.";
        }
        console.log(record);
    })
    return await errors
}

// Function to perform server-side validation of the friend request before sending to db.
const FriendRequestValidator = (requestTo) => {
    let errors = "";
        (async() => {    
            let duplicationErrors = await checkForDuplicateRecord(requestFrom, requestTo);
            console.log('duplication errors: ' + duplicationErrors);
            errors += duplicationErrors;
        })()
    return errors;
};

module.exports = FriendRequestValidator;

Когда я печатаюrecord, я вижу, что если оно существует, данные в records верны.Однако duplicateErrors печатается до record и остается пустым, даже если record не пусто.Это заставляет меня поверить, что именно из-за выбора времени мои результаты не соответствуют ожидаемым, и я неправильно использую async и await.

Заранее большое спасибо за любую помощь!

Ответы [ 2 ]

0 голосов
/ 28 октября 2018

await требуется функция для возврата обещания.Но в вашем случае вы вызывали функцию и обрабатывали errors в функции обратного вызова, поэтому вы получали errors как пустую строку в следующем выражении.

async function checkForDuplicateRecord(requestTo) {
   let errors = "";
    try{
     let friendRequestSent = await FriendRequest.findOne({
        requestTo: requestTo
     });

     //If already sent request to same user throw error
     if(friendRequestSent)
        throw new Error("Your error message")

     //.... rest of code 

    }catch(err){
      //it will throw error if anything goes wrong in your findOne query or error thrown by your logic if request is sent to same user
      errors = err.message
    }
    return errors;
}
0 голосов
/ 28 октября 2018

Изменить функцию checkForDuplicateRecord таким образом

async function checkForDuplicateRecord(requestTo) {
    let errors = "";
    try{
        // do not allow duplicate requests
        let record = await FriendRequest.findOne({
                requestTo: requestTo
            });
        if (record) {
            errors += "{'\n'}You have already sent this person a friend request.";
            console.log(record);
        }
    }
    catch(e){
        errors += "{'\n'}Server Errors.";
    }
    return errors
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...