Ответы пользователя по тегу Node.js
  • Как сделать довыполнение стека операций в MongoDb?

    @napa3um
    Если частичное наличие или отсутствие данных в разных коллекциях может сломать бизнес-логику, то реализовывают двухфазовый комит ( https://docs.mongodb.com/manual/tutorial/perform-t... ), либо выбирают транзакционную БД. Однако часто такой проблемы нет, и предварительно созданные документы в отдельных коллекциях не оказывают влияния на бизнес-логику, пока ссылки на них не попадут в некий "главный документ" (например, пока вновь созданный заказчик не попадёт в заказ, который и нужно создавать после всех "подчинённых" документов в качестве факта обработки запроса пользователя). Лучше не "довыполнять" запросы после падения сервера, а наоборот игнорировать "повисшие" записи. И можно завести некий garbage collector, подчищающий мусор без нужных связей (однократно запускаемый при запуске БД, или только при запуске после аварийного останова). Не стоит планировать отказ БД как основной сценарий обработки запросов, иначе отвлечётесь от задачи интернет-доставки к задаче построения подземного бункера с серверами.
    Ответ написан
    Комментировать
  • Нужен ли пул запросов?

    @napa3um
    1) Пул коннектов фактически обозначает, сколько одновременно с данного инстанса ноды (в скрипте которого вы описываете подключение) может быть отправленно конкурентных (одновременных) запросов к базе данных. Но это число - не единственное ограничение, у самой монги есть настройка в конфиге, сколько она может принимать коннектов, плюс не все запросы могут обрабатываться одновременно (если претендуют на общие ресурсы - https://docs.mongodb.com/manual/faq/concurrency/ ). Плюс можно запускать несколько инстансов ноды в кластере (тогда размер пула, фактически, умножится на количество инстансов ноды - https://nodejs.org/api/cluster.html ). Потому полагаться на параллельность монги не принято, принято архитектурить приложение так, чтобы запросы пользователей не требовали от монги "мощных" операций ("мощные" операции обычно помещают в очередь, сразу "отпустив" клиента). Значение по-умолчанию 5 на инстанс ноды вполне годится для большинства случаев.

    2) Если архитектура приложения позволяет - используйте закешированную в переменную ссылку на коллекцию для выполнения запросов. Это немного (незначительно) ускорит обращение к коллекции за счёт избегания нескольких простых проверок, а так же потенциально немного систематизирует код.
    Ответ написан
    Комментировать
  • Передача значений во внешний promise из внутреннего, как это реализовать (nodeJS,ExpressJS)?

    @napa3um
    Промисы можно вкладывать друг в друга путём возврата нового промиса из обработчика then (если я правильно понял проблему, покажу на примере):

    new Promise((resolve, reject) => {
        setTimeout(() => {
            console.log('операция 1');
            resolve({ op1: true }); /* data for next handler */
        }, 1000);
    })
    .then(data => {
        return new Promise((resolve, reject) => {
            setTimeout(() => {
                console.log('операция 2');
                data.op2 = true; /* update data */
                resolve(data);
            }, 1000);
        })
    })
    .then(data => console.log('операция 1 и 2 выполнены', data)) /* { op1: true, op2: true } */
    .catch(err => console.log('ошибка в операции 1 или 2', err));
    Ответ написан
    2 комментария
  • Как интерпретировать запросы в socket.io?

    @napa3um
    // обработка трёх переменных в экшне:
    socket.on('actionz', function (data) {
    // data.переменная1, data.переменная2, data.переменная3
    }
    
    // и, соответсвенно, вызов экшна с тремя параметрами:
    socket.emit('actionz', { переменная1: ..., переменная2: ..., переменная3: ... });
    Ответ написан
    4 комментария
  • Можно ли спрятать исходные файли скомпилированого приложения electron?

    @napa3um
    Если вам просто скрыть от глаз ресурсы приложения хочется - попробуйте https://github.com/electron/asar . Но шифровать исходники в контейнере придётся самостоятельно, если хотите спрятать от более продвинутых "хакеров".
    Ответ написан
    1 комментарий
  • Логика работы с MongoDB в сервере на Node.JS?

    @napa3um
    При инициализации приложения однократно подключайся к базе данных с помощью MongoClient. Объект MongoClient создаёт пул соединений к БД, и сам восстановит соединение в случае разрыва. Также при инициализации рекомендую получить все необходимые коллекции для дальнейшей работы с ними, т.к. помимо оверхеда на создание JS-объектов в режиме strict получение коллекции вызывает проверку существования коллекции в базе данных. При этом закэшированные объекты коллекций будут использовать вышеописанные преимущества объекта MongoClient - пул соединений и переподключение в случае разрыва. Самостоятельно закрывать соединения не нужно, контекста и блокировок у соединения нет. Т.е., логика примерно такая (очень условно, без учёта архитектуры приложения):
    // init db:
    MongoClient.connect('mongodb://localhost:27017/dbName', function(err, db){
        cached.db = db;
        // init collection:
        db.collection('collName', { strict: true }, function(err, coll){
            cached.coll = coll;
        });
    });
    // usage in request:
    cached.coll.insert(...);
    Ответ написан
    Комментировать