Ответы пользователя по тегу Node.js
  • Почему MongoDB затыкается на больших скоростях?

    zoonman
    @zoonman
    CEO @ LinuxQuestions.ru
    Используйте insertMany() https://stackoverflow.com/questions/16726330/mongo...
    Если Монгу тошнит и она не успевает сохранять, то вы приплыли. Добро пожаловать в мир шардинга.

    По-хорошему, не нужно никаких setInterval(). Распарсили страницу, сохранили, дождались пока она сохранилась, пошли за следующей. Для разбивки между парсингами используйте setTimeout().
    Ответ написан
  • Как правильно делпоить на AWS?

    zoonman
    @zoonman
    CEO @ LinuxQuestions.ru
    Переведите ваше приложение под create-react-app.
    Оно автоматом все файлики собирает с хэшами.
    Дальше сделайте дистрибьюцию через CloudFront и после сборки приложения грузите в бакет артефакты сборки (s3 sync). После загрузки вызывайте сброс кэша дистрибьюции CF.
    Чтобы не ломать фронт, полностью пишите код обратно совместимым в пределах нескольких последних деплойментов.
    Продумывайте стратегию развертываний и т.д. Вплоть до форсирования перезагрузки на клиенте по событию с сервера.
    Ответ написан
  • Как работать с большими данными в MongoDB?

    zoonman
    @zoonman
    CEO @ LinuxQuestions.ru
    Для правильной работы с данными следует использовать курсоры.

    Вам нужно что-то вроде этого.

    Ошибки нет скорее всего из-за закончившейся памяти.
    Ответ написан
  • Разделение прав доступа, express и react?

    zoonman
    @zoonman
    CEO @ LinuxQuestions.ru
    Права нужно проверять везде. На backend в первую очередь. Т.е. админские API должны возвращать 401, когда они вызываются с привелегиями обычного пользователя. Вы можете написать для этого соответствующее middleware.

    До вас уже все придумано

    https://developerhandbook.com/passport.js/passport...
    https://reactrouter.com/web/example/auth-workflow
    Ответ написан
  • Что делать с модулями NPM для Сайта?

    zoonman
    @zoonman
    CEO @ LinuxQuestions.ru
    У меня впечатление того, что вы не совсем понимаете, что такое NPM и Node.js.

    Для начала нужно разобраться с понятиями клиента и сервера. Клиент - это браузер, сервер - то, откуда клиент получает ресурсы. Ресурсы - это html, css, js (созданный для выполнения на клиенте).

    Node.js - это реализация движка Javascript (того самого, который в бразуере), но с применением его на стороне сервера.

    Javascript - это просто язык программирования, но код, написанный на нем, может выполняться в разных средах, т.е. на стороне сервера (node) или на стороне клиента (браузер). Этот код очень похож, но имеет некоторые отличия.

    npm - это пакетный менеджер, упрощенно его задача скачивать архив с кодом и распаковывать в node_modules.

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

    По умолчанию npm пакеты сделаны для работы с Node.js движком. Для того, чтобы их содержимое можно было правильно использовать на стороне клиента, придумали различные ухищрения - сборщики. Их задача адаптировать Node.js код для выполнения на стороне клиента. Попутно они делают еще много чего, например разного рода оптимизации и т.д.
    В вашем случае нужно использовать наиболее популярные сборщики - webpack подойдет для старта.

    npm - отличный инструмент для быстрой установки зависимостей, библиотек и т.д. Но им нужно научиться пользоваться. Есть еще nvm - управление версиями Node.js, тоже надо.

    Дам вам совет - посмотрите https://learn.javascript.ru/screencast/nodejs и разберитесь, что и в каком контексте выполняется. Там же вы найдете пояснения по поводу npm.
    Советую пройти https://ru.hexlet.io/courses/js-setup-environment (это бесплатно).
    И это под конец https://learn.javascript.ru/screencast/webpack

    Не торопитесь, вам необходимы базовые знания, потратьте недельку другую на разбор технологий и не будет возникать глупых вопросов.
    Ответ написан
  • Почему Mongoose уничтожает пул подключений?

    zoonman
    @zoonman
    CEO @ LinuxQuestions.ru
    Иван Чернышев, есть подозрение, что вы где-то делаете db.close() раньше, чем завершена операция.

    Это как работает пул https://mongodb.github.io/node-mongodb-native/core...

    После чтения исходников https://github.com/mongodb-js/mongodb-core/blob/ma... можно понять, что пул разрушается, когда заканчиваются сокеты или наступает лимит попыток пересоединений.

    Mongoose достаточно старый, они фиксили там ошибки. Попробуйте его обновить.

    Еще включите отладку в монгусе.
    mongoose.set('debug', true)
    Ответ написан
  • Как грамотно спроектировать backend real-time приложения?

    zoonman
    @zoonman
    CEO @ LinuxQuestions.ru
    Архитектурно правильно иметь 1 соединение для транспорта данных. Это экономит ресурсы.
    Далее вам нужен роутинг сообщений.
    Например: селекты обрабатываются модулем страницы, а сообщения в чате - модулем чата.
    Реализуется все это достаточно тривиально через шину событий.
    Ответ написан
  • Веб-сервер на Node.js. Как организовать и контролировать сервис для прослушивания вебсокета для каждого активного пользователя?

    zoonman
    @zoonman
    CEO @ LinuxQuestions.ru
    Если вас волнует статическая типизация, то вам следует обратить внимание на Typescript и ts-node.

    По факту все делается достаточно просто при использовании JWT. Вот вам пример https://github.com/auth0-community/auth0-socketio-jwt

    Это поможет въехать в тему https://learn.javascript.ru/screencast/nodejs#node...
    Ответ написан
  • Есть ли бесплатный сервер для скрипта Node.Js?

    zoonman
    @zoonman
    CEO @ LinuxQuestions.ru
    Есть огромное количество недорогих VPS хостингов, можете взять практически любой из них и крутить там.

    У AWS есть бесплатный план на 1 год для новых пользователей. Если вам не требуется постоянное сокетное подключение и не очень много вызовов, то можно использовать Lambda функцию. Это очень дешево, плюс там есть бесплатное количество вызовов на старте.
    Ответ написан
  • Существует ли аналог "пиэчпишного" PDO для Node.js?

    zoonman
    @zoonman
    CEO @ LinuxQuestions.ru
    Обычно берут knex вместо PDO. Для Монги берут mongoose.
    Для фильтрации можно поискать какой-нибудь причиндал вроде Swagger. Можно добавить Joi или Hapi для пущей остроты ощущений.
    Ответ написан
  • Какую архитектуру проекта выбрать?

    zoonman
    @zoonman
    CEO @ LinuxQuestions.ru
    Для всех пользователей - лендинг на www.example.com.
    Все API www.example.com/api/version/whatever

    Все скрывать за реверсивным прокси!
    full-stack-front-end-back-end-comic-joke


    А теперь почему следует делать именно так.
    Домен следует вешать на www по простой причине - субдомены кэшируются на более короткое время, а следовательно переезд будет менее болезненный.
    Лендинги и дребедень делать удобнее всего внутри каталогов. Например, у вас есть ссылка www.example.com/megapartner она может быть расшарена в соц.сетях, на форумах и т.д. Это все увеличивает вес вашего домена для поисковых систем. Если вы будете использовать субдомены, то этот вес будет размываться, т.к. поисковики будут все считать разными сайтами.
    Авторизация и управление пользователями должны быть унифицированы. Не стоит делать 20 разных мест, для которых надо авторизовываться по 100 раз. Для этого давно были придуманы роли. Я рекомендую сразу реализовывать вход через тот же Facebook/Google/OK/VK и т.д.
    Общая авторизация дает громадное количество преимуществ, например облегчает поддержку в разы, позволяет знать контекст выполнения действий.
    Один домен облегчает взаимодействие с пользователем, т.к. ему не нужно запоминать десяток разных страниц.
    Ну и дополнительные плюшки реверсивного прокси заключаются в том, что всегда можно настроить редирект, что-то закэшировать, показать правильную станичку, если какой-то из сервисов отвалился.
    Позади прокси следует все делить по назначению, держать каждый проект в разных репозитариях и т.д. Это может существенно упростить разработку, например можно отдать какой-то лендинг в переработку просто дав доступ к репозитарию.

    Если очень хочется упороться и поиграть в девопса, разбейте на 100500 микросервисов, засуньте все внутрь кубернетиса с каким-нибудь истио. Будет красивая архитектура с контейнерами и плюшками.
    Когда наиграитесь, возьмете обычный nginx, напишете конфигурацию простого реверса и он будет работать годами как часы.
    Ответ написан
  • Как искать в aggregate Mongo?

    zoonman
    @zoonman
    CEO @ LinuxQuestions.ru
    Не следует использовать стадию $match внутри оператора $sum на стадии группировки.

    db.operations.aggregate([
    	{
    		$match: {"address" : "Office 1"}
    	},
    	{
    		$project: {
    			address: "$address",
    			received: {
    				$cond: [ {$eq: ["$operation_type", "receive"]}, "$amount", 0 ]
    			},
    			sent: {
    				$cond: [ {$eq: ["$operation_type", "send"]}, "$amount", 0 ]
    			},
    			dateTime: "$dateTime"
    		} 
    	}, 
    	{
    		$group: {
    			_id: {
    				address: "$address",
    				day: { $dayOfYear: "$dateTime" },
    				year: { $year: "$dateTime" }
    			},
    			received: {
    				$sum: "$received"
    			},
    			sent: {
    				$sum: "$sent"
    			}
    		}
    	}
    ])
    Ответ написан
  • Как грамотно использовать сторонние API в своем web приложении на NodeJS?

    zoonman
    @zoonman
    CEO @ LinuxQuestions.ru
    1. Почему не использовать Google Actions? Или штук вроде dialogflow.com?
    2. Снижение задержек возможно рядом трюков вроде начала отправки голосовых данных непосредственно в сервис с момента начала их произношения. Далее слой кэширования результатов вычленения намерений.
    3. Размещение всего стека распознавания речи и интентов у себя.
    4. Распараллеливание цепочки там, где это возможно.
    Например
    - Купи билеты в кино на хороший фильм Тарантино
    1. Распознавание
    2. Параллельно:
       = Поиск хороших фильмов Тарантино
       = Поиск кинотеатров поблизости
       = Получение данных вашего календаря
    3. = Запрос расписаний из ближайших кинотеатров (можно делать параллельно, если нет общего API)
    4. Поиск оптимального сеанса
    5. Заказ билетов

    5. Асинхронное выполнение через очередь, где возможно.
    Например:
    - Отправь билеты маме.
    - Хорошо. (ставится задание в очередь, выполняется асинхронно не блокируя пользователя)
    Ответ написан
  • Имеет ли смысл Nginx перед Node.js на AWS?

    zoonman
    @zoonman
    CEO @ LinuxQuestions.ru
    Смысла не имеет, поскольку контент лучше класть в S3 и раздавать его оттуда через CloudFront.
    То, что делает ваш nginx, прекрасно делается через ELB.
    Самое главное, если использовать средства Cloud Formation достаточно просто масштабировать проект без исправления каких-либо конфигов и т.п.
    Ответ написан
  • Как оптимизировать запрос mongodb?

    zoonman
    @zoonman
    CEO @ LinuxQuestions.ru
    Сделать индивидуальный индекс для тегов
    schema.index( { url: 1 } )
    schema.index( { tags: 1 }, {sparse: true} )
    schema.index( { catalog: 1 } )


    Склеить теги в одно поле, построить по нему индекс.

    RTFM mongoosejs.com/docs/guide.html#indexes

    Сортировка занимает много времени, т.к. используется индекс catalog_1_tags_1 для условия. Разумеется сортировать по нему не получится.
    Попробуйте сортировать так:
    { $sort: { catalog: 1, tags: 1 } },
    Ответ написан
  • [SSR] Неизвестная ошибка в Angular Universal?

    zoonman
    @zoonman
    CEO @ LinuxQuestions.ru
    Такое бывает, когда вы забыли объявить один из модулей, используемых в приложении.
    Ответ написан
  • Как правильно реализовать авторизацию через JWT?

    zoonman
    @zoonman
    CEO @ LinuxQuestions.ru
    Я использую достаточно своеобразный подход к выдаче JWT.
    У каждого пользователя есть специальное поле, назовем его passId. Оно меняется при смене пароля. Просто генерируется из /dev/random. От этого поля считается хэш и добавляется внутрь JWT. При проверке токена сверяется passId. При необходимости можно усложнить схему и выдавать passId на каждое устройство индивидуально.
    Также связку user:passId легко хранить в любом NoSQL-хранилище и упреждающе обновлять там при смене пароля/компроментации аккаунта.
    Ответ написан
  • Оправдано ли будет использование NodeJS в качестве бэкенда крупного приложения?

    zoonman
    @zoonman
    CEO @ LinuxQuestions.ru
    Paypal и Netflix используют Node.js. У обоих нагрузки очень даже приличные.
    В плане масштабируемости думайте об архитектуре. Можно и на perl написать приложение, которое за секунду будет обслуживать миллион клиентов.
    Node.js будет прекрасно работать в качестве движка для типичного веб-приложения вроде магазина, чата или CRM. Если у вас очень много компонентов, например тысячи, логичнее приложение разбить на модули и сделать вместо одного приложения несколько, которые можно запускать по-отдельности (здесь уместно упоминание микросервисной архитектуры). Разумеется запросы нужно распределять с помощью балансировщика.
    Есть еще такая вот штука https://serverless.com/ - ее можно масштабировать практически до бесконечности. Были бы деньги.
    Node.js будет плохо работать в области процессинга данных, например генерация картинок, потоковая обработка видео, нейронные сети и т.д. Здесь лидеры C, C++, Go, Rust, Java.
    Можно даже создать гибридное приложение - большую часть выполнить на Node.js, а критичную по производительности на другом языке. Например генерация миллиона прайсов в сутки в старый xls или векторный pdf, упаковка в архив и рассылка - не самая лучшая идея для Node..JS. То же C++ здесь будет вне конкуренции.
    Ответ написан