2016-05-22 3 views
0

Я пытаюсь создать метод, который я могу вызвать из всех частей моего экспресс-приложения, я просто передаю значение этому методу, и он ищет через mongodb, используя moongose, чтобы узнать, существует ли пользователь, а затем он возвращает логический результат.node js callback as var

function findUserExists(name){ 

User.findOne({ "name": name }, function(err, user) { 

if (user){ 
    console.log("user exits"); 
    return true; 
} 
else{ 
     console.log("user not exits"); 
    return false; } 
}); 

Теперь, когда я называю это другим способом, таким образом, он не возвращает логическое значение во времени.

if (findUserExists("username")){ 

// redirect to dashboard 
console.log("user exits"); 
    res.redirect('/dashboard'); 
} 
else { 
// redirect to sign up page 
console.log("user must sign up"); 
    res.redirect('/signup'); 
} 

Таким образом, в этом случае другие функции запуска перед тем, как логическое значение из findUserExists(), мой вопрос, как я могу сделать эту функцию, возвращающую значение перед другими функциями запуска, таким образом, что я могу позвонить это в состоянии IF или даже в таком виде var

var exists = findUserExists(name); 
+1

Можете ли вы гнездо "другие функции" в, если заявление? или вызвать их из вашего if (findUserExists («имя пользователя»)) { // функция для вызова } – Sulot

+1

@Sulot это только оператор маршрутизации, чтобы знать, существует ли пользователь, а затем перенаправлять на страницу панели мониторинга, если не перенаправлять на регистрацию страница, я обновил свой вопрос –

+0

Возможный дубликат [Как вернуть ответ от асинхронного вызова?] (http://stackoverflow.com/questions/14220321/how-do-return-the-response-from- а-асинхронный вызов) – JJJ

ответ

4

Вы пытаетесь заставить синхронный код работать с асинхронной функцией. Короткий ответ: вы не должны делать это

Преобразование функции обратного вызова

function findUserExists(name, callback) { 
    User.findOne({ "name": name }, function (err, user) { 
     callback(user); 
    }); 
} 

, а затем использовать, как это:

findUserExists("username", function (exists) { 
    if (exists) { 
     console.log("user exits"); 
     res.redirect('/dashboard'); 
    } else { 
     console.log("user must sign up"); 
     res.redirect('/signup'); 
    } 
}); 

Вы можете использовать обещания в код выглядите более синхронно, если вы используете узел 4 и выше.

1

Это потому, что ваша функция findUserExists вызывает асинхронную функцию, но вы пытаетесь использовать ее синхронно.

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

function findUserExists(name , callback){ 
    User.findOne({ "name": name }, function(err, user) { 
     if(err) callback(err); 
     else if (user){ 
     console.log("user exits"); 
     callback(null, true); 
     } 
     else{ 
     console.log("user does not exist"); 
     callback(null, false); 
     } 
    }); 

    findUserExists("username", function(err, user){ 
     if(err) console.log(err); 
     else if(user){ 
     console.log("user exits"); 
     res.redirect('/dashboard'); 
     // redirect to dashboard 
     } 
     else { 
     // redirect to sign up page 
     console.log("user must sign up"); 
     res.redirect('/signup'); 
     } 
    } 
2

В вашей логике есть проблема, вы не обработки ошибок, которые могут возникнуть в самом запросе, как сервер БД вниз. Избегайте использования обратных вызовов как можно больше и переключиться на обещания, асинхронная Await и т.д ..

Использование Обещания:

Если нет обратного вызова не передается Mongoose, то он будет возвращать Promise , Если запрос успешен он будет решить с документом. В этом случае, если пользователь не существует, то он будет разрешен с помощью null (link), если пользователь существует, тогда он будет разрешен с помощью этого документа. В случае если запрос завершился с ошибкой, например, сервер БД недоступен и т. Д., Тогда обещание будет отклонено с объектом err.

DB вызов

function findUserExists(name){ 
    return User.findOne({ "name": name }) 
    .then(function(doc){//This function will be executed if DB query was successful. 
     //You can write additional logic if any to handle the returned doc here 
     return doc; 
    }, function(err){// This function will be executed if something goes wrong with db server or query. 
     //You can write logic for error handling in DB connection like logging DB failure. 
     return err; 
    }) 
    } 

Validation:

findUserExists(name) 
.then(function(user){//Resolved callback: This function is executed if previous promise was resolved 
    if(!user){ //If user does not exist null will be returned 
    console.log('User must sign up'); 
    return res.redirect('/signup'); 
    } 
    console.log('User Exists'); 
    return res.redirect('/dashboard'); 
},function(err){ //This function is executed if previous promise is rejected 
    console.log('Some error occurred in DB query'); 
}) 
+1

Приятное глубокое объяснение. Вы выполняете обещания и обработку ошибок, которые важны для реального применения. Вопрос Ceddy не упоминал об обработке ошибок - иногда лучше извлекать только проблему из вашего приложения и не пытаться охватить все возможные темы. – Everettss