amstr1k
@amstr1k

Как реализовать отправку 2х и более переменных в SailsJs?

Имеется приложение в котором есть пагинация. На шаблон отдаётся 5 первых элементов и общее количество всех элементов (к примеру 100).

Как реализовать отдачу в шаблон этих элементов?

index: function (req, res) {
		Post.find()
		.sort('id DESC')
			.paginate({page: req.param('page', 0), limit: 5})
			.exec(function (err, posts) {
				if (err) return res.send(500);
				res.view({
					posts: posts,
					countItems: //тут 100
				});
			});
	},


Пробовал так, но кидает ошибку
index: function (req, res) {
		Post.count(function (err, num) {
		    if(err) {
		       return console.log(err);
		    }
		})

		Post.find()
			.sort('id DESC')
			.paginate({page: req.param('page', 0), limit: 5})
			.exec(function (err, posts) {
				if (err) return res.send(500);
				res.view({
					posts: posts,
countItems: num
				});
			});
	},
  • Вопрос задан
  • 219 просмотров
Решения вопроса 1
@friktor
Эмм... Тут тебе лучше использовать промисы, т.е должно получиться чтото вроде.
index: function (req, res, next) {
		var Promise = require("bluebird");
		
		var countAllPosts = Post.count()
			.then(function countResult (count) {
				// Сторонние действия, итерации, и т.д...
				return count; // Обязательно - так мы возвращаем объект promise
			}); 

		var posts = Post.find()
			.sort({
				"id": "desc"
			})
			
			.paginate({
				page: req.param("page", 1),
				limit: 5
			})

			.then(function (posts) {
				return posts; // также возвращаем promise объект
			});

		Promise
			// Метод объеденения нескольких промисов.
			.join(countAllPosts, posts, function (count, posts) {
				res.view({
					countPosts: countPosts,
					posts: posts
				});
			})

			// Независимая обработка ошибок, вне основной логики: cb(err, data) не лучший способ работы с данными в nodejs. 
			.catch(function (errors) {
				res.serverError(); // res.send(500) не родной метод sails и его лучше не использовать, имхо
			})


	}


Самым основным соком тут являються промисы, из библиоткеки bluebird, и ключевой фактор - возврат объекта с обещанием. После этого - создав несколько переменных с действиями на этой технологии - мы объеденяем их с помощью join - и библиотека асинхронно выполняя их создает функцию с результатами выборки.
После этого мы отдаем данные - выполненные без ошибок. Сами ошибки мы обрабатываем независимо от общей логики. Вот так вот. Лично от себя советую подробнее изучить Bluebird - в Sails все работает на нем.
По поводу твоих личных ошибок - ты сделал 2 разные области действия. Колбэк не встраивает переменную в основную область действия - он выполняеться асинхронно внутри самой функции - и поэтому не видим никаким другим функциям. И ошибка выполнения - это неизвестная переменная. Если же ты хотел чтобы была видна переменная num из колбэка - нужно было внутри колбэка вызвать функцию поиска постов.

P.S - прочитай всю документацию sails. Побольше используй трассировку и логирование ошибок хотябы через sails.log.error.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
smanioso
@smanioso
Отмечайте ответы на свои вопросы!
Вместо num используйте posts.length
Ответ написан
Комментировать
amstr1k
@amstr1k Автор вопроса
smanioso

index: function (req, res) {
		// Поиск в модели Post
		Post.find()
			.sort('id DESC')
			.paginate({page: req.param('page', 1), limit: 1})
			.exec(function (err, posts) {
				// Если ошибка вывести страницу 500 (с логом)
				if (err) return res.send(500);
				res.view({
					posts: posts,
					currentPage: req.param('page', 1),
					countItems: posts.length
				});
			});
	},


в таком случае мы получим в результате 1, т.к. limit: 1
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы