• В каких кейсах стоит использовать MVC-фронтенд- и MVC-бэкенд-фреймворк вместе?

    @Abcdefgk
    Если это не модная SPA, то функция ангуляров и прочих реактов сводится к тому, чтобы мешаться под ногами.
    Ответ написан
    Комментировать
  • Где можно почитать по сессии и работу с ними в node.js?

    @Abcdefgk
    Протокол HTTP - это "протокол без сохранения состояния". А "сессия" ("сеанс") - это когда юзер авторизовался на сайте, ходит по разным его страницам - а сервер его везде, на всех страницах узнаёт: О! это тот же юзер! В соответствии с внутренним устройством протокола - не должен узнавать (каждая новая страница - новое состояние), - но узнаёт, собака.
    Вот и вся теория.
    Ответ написан
    2 комментария
  • Как грамотно спроектировать MongoDB?

    @Abcdefgk
    В таких вложенных во вложения вложениях потом поиск по индексам не работает нопремер.
    Надо "проектировать" так, чтобы было меньше вложений, но были отсылающие поля. Всё отдельными коллекциями.
    Ну типа коллекция (модель) City
    {
    name: String,
    region: String,
    country: String
    }
    И потом, чтобы выбрать все города Чукотки, находящиеся в США, можно будет запросить просто:
    City
      .find()
      .where('region', 'Чукотка')
      .where('country', 'США')
      .exec(...
    Ответ написан
    2 комментария
  • Как разобраться с авторизацией в Node.js?

    @Abcdefgk
    Ну, запугали человека - криптография-шриптография.
    Модуль passport - для того и готовый модуль, что он сам всю эту криптографию-шмиптографию сделает. Просто нужно освоить несколько пунктов.
    1. Установить в проект и настроить модули express-session и coockie-parser
    Без них passport не будет работать - а в чём же будет тогда смысл его работы, если он в сессию и записывает юзера после регистрации.авторизации? ("сессия" - это специальный подобъект в объекте request - req.session - куда passport сам вписывает под-объект user после авторизации)
    2. Разобраться, что passport - это общий модуль, который обеспечивает работу дополнительных модулей, в которых содержатся, как раз, всякие разные стратегии авторизации - локальная стратегия, через Фейсбук (passport-facebook), через Гугол (passport-google-oauth) и т.д.
    3. Для авторизаций через соцсети нужно в каждом случае поразбираться, как в них создавать "приложения" - оттуда для стратегий нужно будет брать ID юзера и Key, которые эти доп-модули будут запрашивать.
    4. Создаётся один большой файл-модуль для авторизации - типа auth.js - куда реквайрится сам passport плюс реквайрятся нужные (по желанию) стратегии. Типа вот так выглядит верхушка файла:
    var passport = require('passport')
    , FacebookStrategy = require('passport-facebook').Strategy
    , GoogleStrategy = require('passport-google-oauth').OAuth2Strategy;
    и для каждой из стратегий пишется код, который уже весь есть в документации модуля passport - его нужно оттуда взять и в нём, конечно, поразбираться. Не в криптографии-шриптогравии, а в этом конкретном коде.
    (Ну, и книжку внимательно изучить - я говорил в другом месте, какую)
    Ответ написан
    5 комментариев
  • Как сделать переход по страницам без перезагрузки страницы (pug, express)?

    @Abcdefgk
    Да надо одним GET-запросом отдать всё. Это же элементарно, Ватсон, - сделать, как в почте Gmail, и безо всякого пресловутого ангуляра. Три больших (на всю страницу) div-а с контентом (отбросив их в шаблонизаторе в layouts) - и переключать ихний style.display - block/none
    Вот, сварганил общую схему от скуки:
    <!DOCTYPE html>
    <html>
    <head>
    	<title>NAV</title>
    	<meta charset="utf-8">
    	<style>
    		ul li {
    			display: inline-block;
    			cursor: pointer;
    		}
    		#one,
    		#two,
    		#three {
    			width: 80%;
    			height: 500px;
    		}
    		#one {
    			border: 5px solid red;
    		}
    		#two {
    			border: 5px solid green;
    		}
    		#three {
    			border: 5px solid blue;
    		}
    	</style>
    </head>
    <body>
    	<div>
    		<ul>
    			<li>Красный</li>
    			<li>Зелёный</li>
    			<li>Синий</li>
    		</ul>
    	</div>
    
    	<div id="one" style="display:block"></div>
    	<div id="two" style="display:none"></div>
    	<div id="three" style="display:none"></div>
    
    	<script>
    		var red = document.getElementById('one');
    		var green = document.getElementById('two');
    		var blue = document.getElementById('three');
    
    		var ul = document.querySelector('ul');
    		ul.children[0].onclick = function() {
    			green.style.display = 'none';
    			blue.style.display = 'none';
    			red.style.display = 'block';
    		}
    		ul.children[1].onclick = function() {
    			red.style.display = 'none';
    			blue.style.display = 'none';
    			green.style.display = 'block';
    		}
    		ul.children[2].onclick = function() {
    			red.style.display = 'none';
    			green.style.display = 'none';
    			blue.style.display = 'block';
    		}
    	</script>
    </body>
    </html>
    Ответ написан
  • Как вывести значения в index.html(node.js + express)?

    @Abcdefgk
    Методres.render('file') - это упакованная (для удобства) примерно такая штука:
    var jade = require('jade');
    var htmlText = jade.renderFile('./file.jade', { ... });
    res.send(htmlText);

    Познакомьтесь с каким-нибудь шаблонизатором для Express.
    Ответ написан
  • Как принять данные из потока Node.js?

    @Abcdefgk
    Круть!
    Я думаю, надо на странице напейсать такой скрипт:
    var elem = document.createElement('img');
    elem.src = '/...'; //путь до нужного файла

    и вставить этот elem в нужное место.
    Атрибут src - это и есть GET-запрос
    Ответ написан
    Комментировать
  • Как правильно сохранить модель в MongoDB?

    @Abcdefgk
    new Game({
        timeCreated: Date.now()
    }).save();
    Ответ написан
    Комментировать
  • Linux или Windows для C++ разработчика?

    @Abcdefgk
    "На вопрос о том, какую операционную систему следует использовать, Windows, Unix или Макинтош, я обычно отвечаю: ту, которую используют ваши друзья. Преимущества, которые получите, воспользовавшись помощью друзей, перевесят любые сложности, связанные с освоением операционной системы или языка программирования." (Питер Норвиг, "Научитесь программировать за десять лет")
    Ответ написан
    1 комментарий
  • Как правильно отправить ajax-запрос если человек закрывает страницу?

    @Abcdefgk
    Никак. Мучился недавно с этим вопросом - на локалхосте это работает в обработчике события beforeunload, а на реальном сервере - нет.
    Ответ написан
    Комментировать
  • Можно ли скачать видео с помощью nodejs?

    @Abcdefgk
    var fs = require('fs')
    	, request = require('request');
    
    request.get('http://fs.moviestape.net/video/1c4ed0ac8b7d5b4de6c5d58e2ea31a63/serials/Narcos/s01/Narcos.S01E01.mp4')
    			.on('error', function(err) {
    				console.error(err);
    			})
    			.on('response', function(res) {
    				console.log(res.statusCode);
    				console.log(res.headers['content-type']);
    			})
    			.pipe(fs.createWriteStream('Narcos.S01E01.mp4'))
    			.on('finish', function() {
    				console.log('OK');	
    			});
    Ответ написан
  • Нет события beforeunload - есть какое-то объяснение?

    @Abcdefgk Автор вопроса
    Короче, если кому интересно, то я всё сделал иначе, и оно работает, вроде.
    Я сам себе придумал проблему, когда для подсчёта клиентов стал записывать в массивы комнат случайные типа-айдишники.
    Тогда как каждое socket-соединение имеет собственный уникальный id - их-то, уникальные id, и надо в эти массивы складывать. И тогда я могу обойтись без имени комнаты, из которой клиент ушёл.
    При событии socket.on('disconnect', ... (а оно неизбежно, как смерть и налоги) мы легко можем зафиксировать, какой сокет отключился, - по его этому самому id. Остаётся только перебрать весь объект-хранилище и удалить этот конкретный элемент. Ну вот так:
    socket.on('disconnect', function() {
    	for(var key in clientsArray) {
    		for(var i=0; i<clientsArray[key].length; i++) {
    			if(clientsArray[key][i] == socket.id) {
    				clientsArray[key].splice(i, 1);
    			}
    		}
    	}
    });

    Вуаля.
    Правда, с событием beforeunload непонятка так и осталась.
    Ответ написан
  • Почему не ставится res.header?

    @Abcdefgk
    res.set('Content-Type', 'application/json')
    либо
    res.setHeaders
    Ответ написан
  • Как с одного роутера отправить два запроса?

    @Abcdefgk
    А где тут два запроса?
    Ответ написан
    Комментировать
  • Почему сообщение не отправляется всем клиентам (socket.io)?

    @Abcdefgk
    А попробуйте стереть
    client.emit("hello", {
          hello: `Привет ${data}!`
        });

    Право, я только что разбирался с системой "rooms & namespace" в socket.io - и оно, как оказалось, так замечательно там работает, что я теперь даже не верю, что у них там что-нибудь не работает.
    Ответ написан
  • Почему не работает запрос с методом PUT?

    @Abcdefgk
    Наверное, потому что это не AJAX-запрос (хотя, я не вижу клиентскую сторону и просто догадываюсь), а значит, это GET. К тому же, вы его и обрабатываете - как GET.
    Ответ написан
  • Какую операционную систему использовать для разработки на Python?

    @Abcdefgk
    "На вопрос о том, какую операционную систему следует использовать, Windows, Unix или Макинтош, я обычно отвечаю: ту, которую используют ваши друзья. Преимущества, которые получите, воспользовавшись помощью друзей, перевесят любые сложности, связанные с освоением операционной системы или языка программирования." (Питер Норвиг, "Научитесь программировать за десят лет")
    Ответ написан
    Комментировать
  • [fs - express.js] В чём проблема?

    @Abcdefgk
    Ну правильно, null - это значит, что ошибки при чтении не было. Разве это плохо? Если приписать в колбек-функцию ещё один аргумент, то в нём как раз и окажется успешно прочитанный файл.
    Ответ написан
    Комментировать
  • Как вынести маршруты в отдельные файлы?

    @Abcdefgk
    Берёте вот эту штуку
    function(req, res) {
        if(req.isAuthenticated() && req.user.role == 'user')
            res.render('user');

    и делаете так:
    module.expotrts = function(req, res) {
        if(req.isAuthenticated() && req.user.role == 'user')
            res.render('user');
    };

    , - назвав этоfoo.js

    А потом так:
    app.get('/user', require('./foo'));
    Всего делов
    Ответ написан
  • Как модифицировать синтаксис JavaScript?

    @Abcdefgk
    Переходите на Lisp - там каждый, кто начитает чего-нибудь пейсать, первым делом модифицирует язык.
    (кстати, это будет легко, потому что javascript - это си-образный наследник Lisp)
    Ответ написан
    Комментировать