Задать вопрос
Ответы пользователя по тегу Node.js
  • Почему не подключается Js скрипт?

    bingo347
    @bingo347 Куратор тега Node.js
    Crazy on performance...
    А Вы пробовали пройти Вашу строчку по шагам?
    app.use( // 5
      express.static( // 4
        path.join( // 3
          __dirname, // 1
          'public' // 2
    )))

    1. __dirname - Содержит абсолютный путь до папки с файлом в котором выполняется (для примера пусть будет '/path/to/project')
    2. 'public' - просто строчка
    3. соединяем (1) и (2) как путь, получим '/path/to/project/public'
    4. express.static - принимает путь из (3) и создает функцию которая обрабатывает запросы и ищет им соответствие в виде файлов в указанной папке
    5. app.use - просто подключает функцию из (4) к движку express'а, без каких либо фильтров, то есть функция static обработает абсолютно все запросы которые дойдут до нее

    Теперь смотрим на шаблон, в нем прописан скрипт public/reglog.js
    Это относительный путь, то есть он автоматом соединится с путем от куда вызван
    то есть если main.hbs отрисуется в условный site.com/index.html - то скрипт запросится из
    а если main.hbs отрисуется в условный site.com/some/nested/index.html - то скрипт запросится из site.com/some/nested/public/reglog.js

    Теперь представьте, в функцию 4 попадает запрос /some/nested/public/reglog.js
    она соединяет ее с путем из (3) и получает путь /path/to/project/public/some/nested/public/reglog.js
    потом смотрит его на диске и естественно ничего не находит, ставит в express response статус 404 и отдает управление дальше в express

    для ленивых, которым готовый суп, а не разобраться почему
    <script src="/reglog.js"></script>
    Ответ написан
    1 комментарий
  • Как установить зависимости с прошлого проекта в новый package.json?

    bingo347
    @bingo347 Куратор тега Node.js
    Crazy on performance...
    npm i это короткий вариант npm install
    Без параметров он устанавливает зависимости из package.json и если есть файл package-lock.json, то нормализует папку node_modules по нему.
    npm i nameустановит пакет name версии отмеченной тегом latest (тэг по умолчанию)
    npm i name@tagустановит пакет name версии отмеченной тегом tag
    npm i name@5установит пакет name версии 5.x.x где x.x - последний из 5
    npm i name@5.3установит пакет name версии 5.3.x где x - последний из 5.3
    npm i name@5.3.1установит пакет name версии 5.3.1
    параметр --save или его короткий вариант -S сохранит зависимость в package.json в секции dependencies, с некоторых пор это поведение по умолчанию при наличии package.json
    параметр --save-dev или его короткий вариант -D сохранит зависимость в package.json в секции devDependencies

    А как устанавливать в Вашем конкретном случае можете решить только Вы.
    Ответ написан
    Комментировать
  • Как отправить данные из бекенда на фронтенд?

    bingo347
    @bingo347 Куратор тега Node.js
    Crazy on performance...
    Ответ написан
    Комментировать
  • Нужен ли TypeScript для написания бэкенда на Node.js?

    bingo347
    @bingo347 Куратор тега Node.js
    Crazy on performance...
    Можно ли обойтись обычным js?
    Можно. TypeScript лишь добавляет к JavaScript статическую типизацию в компайл-тайм. После компиляции будет все тот же JS.

    Какие будут плюсы?
    Главный плюс, ИМХО, - скорость разработки за счет подсказок IDE и автодополнения, больше авторефакторингов. Ну и возможность ограничить использование функций/методов от нежелательного использования тоже плюс. А если еще и проектировать доменную модель на типах, то можно сразу видеть, если что-то не сходится, еще до написания логики.

    Не будет ли много лишней писанины по сравнению с чистым js?
    Большинство типов TypeScript способен вывести. Далеко не Хиндли-Милнер конечно, но тоже хорошо. Я пишу больше в ФП стиле, с редкой примесью структурно-процедурного при описании эффектов, так у меня явные указания типов присутствуют только в сигнатурах функций. В самой логике код неотличим от обычного JS, но с хорошей проверкой типов.

    Будет ли сложно хранить скомпилированный js?
    Как и любые другие артефакты сборки, скомпилированный JS хранить не нужно. Компилируйте непосредственно перед выкладыванием на продакшен, а в git храните лишь TS код + настройки компилятора. А в dev среде вообще можно запускаться через модуль ts-node.
    Ответ написан
    Комментировать
  • Функция возвращающая данные полученные из БД, как правильно написать?

    bingo347
    @bingo347 Куратор тега Node.js
    Crazy on performance...
    const select = (query) => new Promise((resolve, reject) => {
      const request = new Request(query);
      request.once('error', reject);
      request.once('done', (rowCount, more, rows) => {
        resolve(rows.map(
          columns => columns.map(
            column => column.value
          )
        ));
      });
      connection.execSql(request);
    });
    Ответ написан
    4 комментария
  • Как отправить массив через бинарные протоколы?

    bingo347
    @bingo347 Куратор тега Node.js
    Crazy on performance...
    Комментировать
  • Почему при выполнении скрипта node.js увеличивается занятая RAM?

    bingo347
    @bingo347 Куратор тега Node.js
    Crazy on performance...
    Давайте посмотрим, что Вы тут накодили... Я уберу Ваши комментарии из кода и добавлю свои:
    const setup = {port:8000}
    const express = require ('express');
    const puppeteer = require('puppeteer');
    
    const app = express ();
    
    app.get('/', (req, res) => {
        const url = req.query.url;
    
        // вот тут Вы на каждый запрос создаете весьма тяжелую функцию
        // в ней 203 AST ноды
        // и она жрет в среднем 220КБ оперативы
        // (node: 14.4.0; v8: 8.1.307.31-node.33, мерил через process.memoryUsage().heapUsed)
        let scrape = async () => {
    
            // а еще на каждый запрос запускам новый браузер
            // у ноды это особо памяти не отнимет, а вот у системы - прилично
            const browser = await puppeteer.launch({args: ['--no-sandbox']});
            const page = await browser.newPage();
    
            // еще и разрешаем запросу из браузера жить вечно
            // если конечно сервак не оборвет коннект
            await page.setDefaultNavigationTimeout(0);
    
            await page.setUserAgent('Mozilla/5.0 (Linux; Android 7.0; NEM-L51) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.81 Mobile Safari/537.36');
            await page.setViewport({width: 375, height: 812});
    
            // куда мы отправляем браузер?
            // переменная url у нас из req.query.url - а следовательно начинается с /
            // то есть без хоста и протокола...
            await page.goto(url);
    
            // что-то мне подсказывает, что это работает не совсем так
            // как Вы ожидаете
            // https://github.com/puppeteer/puppeteer/blob/main/docs/api.md#pageevaluatepagefunction-args
            // читаем: If the function passed to the page.evaluate returns a non-Serializable value, then page.evaluate resolves to undefined
            const bottomSheet = await page.evaluate(() => {
                return document.querySelector('div[data-marker="bottom-sheet"]');
            });
    
            // так как undefined !== null данное условие всегда истинно
            if (bottomSheet !== null) {
                // здесь по идее придет Promise.reject который мы не ловим (об этом ниже)
                await page.click('div[data-marker="bottom-sheet"] button');
            }
    
            // и еще раз... ловите доку на нужный метод:
            // https://github.com/puppeteer/puppeteer/blob/main/docs/api.md#pageselector
            const phoneButton = await page.evaluate(() => {
                return document.querySelector('a[data-marker="item-contact-bar/call"]');
            });
    
            // всегда ложное условие...
            if (phoneButton === null) {
                await browser.close();
                return false; // ...с return внутри...
            }
    
            // еще 1 способ зависнуть (дефолтный таймаут 30 сек)
            await page.waitForSelector('a[data-marker="item-contact-bar/call"]');
    
            await page.click('a[data-marker="item-contact-bar/call"]');
    
            try {
                await page.waitForSelector('span[data-marker="phone-popup/phone-number"]');
            } catch (e) {
                await browser.close();
                return false;
            }
    
    
            const result = await page.evaluate(() => {
                console.log('phone', document.querySelector('span[data-marker="phone-popup/phone-number"]'));
                return document.querySelector('span[data-marker="phone-popup/phone-number"]').innerHTML;
    
            });
    
            await browser.close();
            return result;
    
        };
    
        // не ловим reject промиса
        // и в случае reject не завершаем запрос
        // и он тоже висит в памяти
        scrape().then((value) => {
            console.log(value);
            if (value === false)
                res.send(500);
            // при value === false будет запись в закрытый поток... (или у express есть защита от дурака?)
            res.send(value);
            // абсолютно бесполезное действие...
            scrape = null;
        });
    });
    
    
    app.get('/test', (req, res) => {
        res.send('Тест');
    });
    
    app.listen(setup.port, () => {
        console.log('Сервер: порт %s - старт!', setup.port);
    });
    Ответ написан
    1 комментарий
  • Нужно ли обнулять переменные после использования?

    bingo347
    @bingo347 Куратор тега Node.js
    Crazy on performance...
    https://habr.com/ru/company/badoo/blog/454930/
    вот не плохая статья на тему современного GC в v8
    Ответ написан
    1 комментарий
  • Как подключить/использовать самописный babel-плагин?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Во-первых. нужно оформить именно как плагин:
    https://github.com/jamiebuilds/babel-handbook/blob...
    export default function({ types: t }) {
      return {
        visitor: {
          Identifier(path) {
            if(path.isIdentifier({ name: 'test' })) {
              path.parentPath.get('init').node.value = 777
            }
          }
        }
      };
    };

    Во-вторых, делаем кофиг бабеля в js формате, и прописываем абсолютный путь к нашему плагину в секции plugins, path.join и __dirname в помощь
    Ответ написан
    Комментировать
  • Как запустить еще один файл nodejs с парметрами(login,pass) в самом коде?

    bingo347
    @bingo347 Куратор тега Node.js
    Crazy on performance...
    https://nodejs.org/dist/latest-v14.x/docs/api/chil...
    через env можно передать параметры
    Ответ написан
    Комментировать
  • Как в консоле в Node.js вывести методы которые есть у экземпляра класса?

    bingo347
    @bingo347 Куратор тега Node.js
    Crazy on performance...
    Во-первых, логировать через console.dir с опцией showHidden: true
    // Для класса ClassName
    console.dir(ClassName.prototype, {showHidden: true});
    
    // Для любого объекта или инстанса класса obj
    console.dir(Object.getPrototypeOf(obj), {showHidden: true});


    Ну и зная, что любой прототип - это тоже объект, а корневой прототип всегда null, то можно просто пройтись рекурсивно, чтоб посмотреть всю цепочку:
    class SomeClass extends Array {}
    function collectPrototypesChain(obj) {
      const proto = Object.getPrototypeOf(obj);
      if(!proto) { return null; }
      const {name} = proto.constructor;
      return {name, proto, next: collectPrototypesChain(proto)};
    }
    
    console.dir(collectPrototypesChain(new SomeClass()), {showHidden: true, depth: 4});
    Ответ написан
    3 комментария
  • Как слушать несколько портов и адресов в http.js?

    bingo347
    @bingo347 Куратор тега Node.js
    Crazy on performance...
    Придется поднять 2 инстанса http сервера, каждый на своем порту и адресе.
    В принципе их можно будет использовать с общим app, так как и у req и у res есть свойство socket, являющееся инстансом net.Socket, а значит из него можно получить адрес и порт:
    https://nodejs.org/dist/latest-v14.x/docs/api/http...
    https://nodejs.org/dist/latest-v14.x/docs/api/http...
    https://nodejs.org/dist/latest-v14.x/docs/api/net....
    var app = require('express')();
    var http = require('http');
    var server1 = http.createServer(app);
    var server2 = http.createServer(app);
    
    server1.listen(PORT1, ADDRESS1);
    server2.listen(PORT2, ADDRESS2);

    io правда придется создать 2 инстанса, но обработчики событий опять же можно навесить общие.
    Ответ написан
    Комментировать
  • Каким путем лучше пойти при хранении индентефекатора сессии?

    bingo347
    @bingo347 Куратор тега Node.js
    Crazy on performance...
    Самый безопасный способ - кука с флагами secure и http-only, с ней может работать только сервер и передается она только по https.
    Все остальное спокойно уводится любым сторонним скриптом на Вашем сайте
    Ответ написан
    Комментировать
  • Как обработать 2 запроса одновременно в node.js?

    bingo347
    @bingo347 Куратор тега Node.js
    Crazy on performance...
    Комментировать
  • Как правильно разбивать зависимости npm пакета?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Хорошей практикой является не тащить зависимости в бандл.
    В webpack есть externals
    В rollup есть external
    Если Вы вшиваете свои зависимости в бандл своего пакета - Вы без вариантов создаете дублирование кода в бандле, если мне нужны те же зависимости, что и Вашему пакету и дополнительно Ваш пакет
    Ответ написан
  • Как я могу прочитать файл на другой локальной машине?

    bingo347
    @bingo347 Куратор тега Node.js
    Crazy on performance...
    что-то мне кажется что надо слеши экранировать пробовал так /\ ничего не выходит
    Да, обратный слэш нужно экранировать, так как он сам является экранирующим символом, прямой же слэш не экранирует, поэтому ничего не выходит
    Пример:
    \\ -> \
    \\\\ -> \\

    ну и модуль path в ноде, достаточно умный, чтоб привести слэши в путях к используемым в системе, поэтому можно просто
    path.normalize( '//192.168.1.5/C$/data/data.json' )
    Ответ написан
    5 комментариев
  • Выигрывает ли nodejs в производительности php на примере обычного сайта?

    bingo347
    @bingo347 Куратор тега Node.js
    Crazy on performance...
    В общем случае все зависит от того как написать, можно и на ноде понаписать таких тормозов, что хорошо оптимизированный php, особенно 7, будет просто летать на фоне этого.
    Ну и в большинстве серверных приложений основная нагрузка приходится на БД, а значит и скорость в большей части будет зависеть от нее.
    Но за счет асинхронной работы нода однозначно выиграет у php по потребляемым ресурсам, что в конечном итоге так же может сказаться на производительности.
    Ответ написан
    8 комментариев
  • Как дождаться конца выполнения цикла?

    bingo347
    @bingo347 Куратор тега Node.js
    Crazy on performance...
    .then(lefts => {
        return Promise.all(
            lefts.map(left => models.db.l_d.findOne({where: {id: left.l_d.id}})
                .then(ld => ld.getMains())
            )
        ).then(mains => mains.flatMap((main, i) => main.map(m => ({
            data: data.name,
            dataId: data.Id,
            left: lefts[i].name,
            leftId: lefts[i].id,
            main: m.name,
            mainId: m.id,
            linkId: m.ld_m.id
        }))));
    }).then(
        result => console.log(result),
        err => console.log(err)
    )
    Советую получше изучить промисы
    Ну и давать нормальные имена переменным не лишнее
    Ответ написан
    Комментировать
  • Как задать переменные в области видимости для нового экземпляра класса?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    не изобретать граблей, а сделать по простому:
    // A.js
    class A {
      constructor(some_var) {
        this.some_var = some_var;
      }
    
      do() {
        console.log(this.some_var);
      }
    }
    module.exports = A;
    
    // index.js
    const A = require('./A');
    function print_it(param) {
      const a = new A(param);
      a.do();
    }
    print_it('wow'); // В консоли должно вывестись: wow
    print_it('123'); // В консоли должно вывестись: 123


    P.S. snake_case не принят в js, рекомендуется использовать camelCase

    UPD:
    Вам придется хакнуть модульную систему ноды. Почитать можно в офф доке:
    https://nodejs.org/dist/latest-v14.x/docs/api/modu...
    https://nodejs.org/dist/latest-v14.x/docs/api/vm.html
    Ответ написан
    4 комментария