2015-09-26 2 views
3

У меня есть это сомнение, на самом деле это не проблема, но я хочу знать, не связана ли моя фактическая структура обработкой запросов и ответов.Запросы и ответы Expressjs маршрутов асинхронны?

Некоторые из моего кода выглядит следующим образом:

get: (req, res) -> 
    permission = req.user.username 

    if not permission 
     return res.json new Unauthorized("#{req.user.username} no tiene permisos") 

    Client.find() 
     .exec (err, clients) -> 
     if err then res.json new Internal(err.message, err.stack) 
     if not clients then res.json new NotFound('No encontrado') 

     res.json new Ok(clients, 'OK') 

И, конечно, обрабатывается в архиве маршрутизатора, но я не знаю точно, когда мой код асинхронный и когда это не так.

Итак, может ли кто-нибудь объяснить мне, является ли это асинхронным неблокирующим кодом? Если это не так, пожалуйста, немного документации или библиотек? Я попытался использовать promjs, но это порождает некоторые ошибки в выполнении (я думаю, это потому, что im pretty noob).

Это все, спасибо заранее!

+1

Вы можете реально проверить, заблокирован ли Client.find, добавив console.log ('found') в обратный вызов exec и console.log ('before found') в самом низу функции get. «before found» должен отображаться первым, и когда результаты от db возвращаются, вы должны увидеть «найденный» – Molda

+0

Да! появляется сообщение «before», ну, до ха-ха. Могу ли я сказать, что код асинхронный, не так ли? – Nano

+0

Это доказало, что я не хочу :) nodejs не дождался результата из db и продолжил обработку и асинхронный звук этого звука. – Molda

ответ

2

Mongoose's exec() - это асинхронная функция в вашем коде. Как правило, дорогостоящие операции являются асинхронными, а дешевыми операциями не являются *. Дорогое означает операцию, которая занимает несколько мс, например, чтение удаленного файла, доступ к (возможно) удаленной базе данных или даже чтение локального файла. Некоторые примеры дорогих асинхронных операций:

  • request: загрузить внешний веб-сайт.
  • fs: чтение файлов из вашей системы. Большинство функций являются асинхронными, но поскольку чтение файла не является чрезмерно дорогостоящим, они также имеют синхронную версию.
  • mongoose: как объяснил @Molda, ваш вызов мангуста асинхронен. Большинство операций в мангусте.

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

request('httsp://google.com/', function(err, response, body){ 
    console.log(body); // print the website's html on the terminal 
}); 

fs.readFile('/config.js', function(err, message){ 
    console.log(message); // print the contents of config.js on the terminal 
}); 

User.find({ id: 25 }, function(err, user){ 
    console.log(user); // print user's 25 data on the terminal 
}); 

Edit: в качестве альтернативы вы могли бы упростить свой код на одну строку, включив функцию обратного вызова в find(), что делает эту функцию асинхр:

Client.find {}, (err, clients) -> 
    if err then res.json new Internal(err.message, err.stack) 
    if not clients then res.json new NotFound('No encontrado') 

    res.json new Ok(clients, 'OK') 

* Пожалуйста, обратите внимание, что дорогие и дешевые очень относительны. Например, parsing a huge file in JSON can be really expensive, и они синхронны, а чтение небольшого файла относительно дешево.

+1

Это была полезная информация! спасибо – Nano

+0

Добро пожаловать, рад помочь –