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

    bingo347
    @bingo347 Куратор тега Node.js
    Crazy on performance...
    Если вводить один и тот же пароль несколько раз- хеш всегда будет разный
    нет. Вся суть хэш функций, что при всей своей необратимости они всегда выдают детерминированный результат, то есть простым языком на одни и те же входные параметры выдаются одни и те же выходные.
    То есть один и тот же пароль всегда даст один и тот же хэш.

    Конкретно с bcrypt - это хэш с солью. То есть у него не 1 входной параметр (пароль), а 2 - пароль и соль. При создании нового хэша генерируется новая соль (в идеале крипто рандомом). Поэтому и меняется хэш. Это усложняет взлом, так как без соли я бы просто мог иметь заранее рассчитанный словарик хэшей для частых паролей, а с солью мне придется делать полный перебор, даже если у пользователя банальный qwerty пароль.

    Для валидации соль хранится в базе вместе с хэшем, мы просто не генерируем новую соль, а хэшируем с сохраненной.
    Ответ написан
    1 комментарий
  • Как передать метод класса в worker_theards node.js?

    bingo347
    @bingo347 Куратор тега Node.js
    Crazy on performance...
    Потому что функции не являются сериализуемым объектом
    Если что, сериализуется этим: https://nodejs.org/docs/latest-v12.x/api/v8.html#v...
    Вы можете послать сообщение, а метод поток должен вызывать сам
    Ответ написан
  • Как отследить посещение пользователя?

    bingo347
    @bingo347 Куратор тега Node.js
    Crazy on performance...
    Потому что лайки - это не просто int счетчик в таблице статей, это отдельная таблица вида
    user_id | article_id | еще какие-то поля, вроде логов или еще что-то надо
    Первичным индексом у этой таблицы будет 2 поля - user_id и article_id
    И уже сама база не позволит одному юзеру поставить лайк 2 раза на 1 статью
    Ответ написан
    1 комментарий
  • Импорт модуля ради «побочных эффектов»?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Для начала стоит понять сам термин "побочный эффект".
    Вот Вы вызываете функцию, а она что-то делает за своими пределами, например пишет в файл или localStorage, или меняет Ваш DOM на странице, или меняет глобальные объекты. Это и есть побочные эффекты.
    Модуль тоже может иметь побочные эффекты. Например Вы можете не просто экспортировать некоторые функции из модуля, но и сразу что-то сделать, вне всяких функций.
    Например пусть у нас будет такой модуль:
    const div = document.body.appendChild(document.createElement('div'));
    
    export function remove() {
      document.body.removeChild(div);
    }
    Даже если мы просто импортируем его, но не вызываем функцию remove, он все равно произведет свой побочный эффект - добавит новый div в body. И это произойдет при первом встретившемся импорте.
    Нам в принципе может быть и не нужна функция remove (ее даже может и не быть), но нам нужен этот div в body - тогда можем просто сделать импорт как в Вашем примере и получить div в body в качестве результата.

    Конкретно в контексте вебпака и импортирования стилей, у Вас скорее всего будет включен в обработку или style-loader или MiniExtractCssPlugin.loader. Побочный эффект style-loader - добавление тега style со стилями из импортируемого css в head. А у MiniExtractCssPlugin.loader - побочный эффект - извлечение стилей в отдельный файл.
    Ответ написан
    1 комментарий
  • Можно ли использовать Nodejs во Vue при написании программы на Electron?

    bingo347
    @bingo347 Куратор тега Node.js
    Crazy on performance...
    Можно. В том числе и без дополнительных пакетов.
    Нодовский require в render процессе есть так же в глобальном объекте (в window) и работает относительно html файла, с которым этот render процесс был запущен.
    Для вызова builtin модулей (всяких fs или самого electron) вообще пофиг, относительно чего работает require.
    В main процессе при создании render процесса (а так же для всех webview) нужно разрешить nodeintegration
    Ответ написан
    1 комментарий
  • Как организовать асинхронную функцию .map?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    let rawNews = []; // Массив объектов (Свеженькие новости прямо из БД)
    let rawCats = []; // Массив объектов с обработанными новостями
    // Промис с массивом результатов
    let modifyNews = Promise.all(rawNews.map(async (item, i, arr) => {
        item.autor = await getUserByID(item.autor); // Асинхронная функция которая выставляет имя автора вместо id
        return item;
    }));
    Ответ написан
    1 комментарий
  • Как отформатировать строку?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Я бы так сделал:
    // export или module.export =
    function formatText(text, formatters) {
      return formatters.reduceRight(applyFormatter, text);
    }
    
    function applyFormatter(text, formatter) {
      const {offset, length, type} = formatter;
      const endOffset = offset + length;
      const wrapper = getWrapper(type);
      return `${text.slice(0, offset)}${wrapper(
        text.slice(offset, endOffset),
        formatter
      )}${text.slice(endOffset)}`;
    }
    
    function getWrapper(type) {
      switch(type) {
      case 'bold':
        return boldWrapper;
      case 'text_link':
        return linkWrapper;
      default:
        return identityWraper;
      }
    }
    
    function boldWrapper(text) {
      return `<b>${text}</b>`;
    }
    function linkWrapper(text, {url}) {
      return `<a href="${url}">${text}</a>`
    }
    function identityWraper(text) {
      return text;
    }

    Использование:
    console.log(formatText('qwerty Ссылка', [
      { offset: 0, length: 7, type: 'bold' },
      { offset: 7, length: 6, type: 'text_link', url: 'https://vk.com/' }
    ])); // <b>qwerty </b><a href="https://vk.com/">Ссылка</a>
    Ответ написан
    Комментировать
  • Как сделать объект доступным во всех файлах без импорта?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Можно положить в global, хотя это и не очень хорошая практика
    Ответ написан
  • Возможно ли сделать promisify для дочернего процесса spawn?

    bingo347
    @bingo347 Куратор тега Node.js
    Crazy on performance...
    promisify меняет сигнатуру функции с условного
    function func<T>(...args: any[], cb: (err: any, result: T) => void): any;
    // или
    function func<T1, T2>(...args: any[], cb: (err: any, res1: T1, res2: T2) => void): any;
    на
    function func<T>(...args: any[]): Promise<T>;
    // или
    function func<T1, T2>(...args: any[]): Promise<{res1: T1; res2: T2}>;

    Для exec это возможно, так как его сигнатура подходит под 2 вариант:
    function exec(command: string, options?: ExecOptions, cb: (err: Error, stdout: string | Buffer, stderr: string | Buffer) => void): ChildProcess;
    что приходит к сигнатуре:
    function exec(command: string, options?: ExecOptions): Promise<{stdout: string | Buffer; stderr: string | Buffer}>;

    Для spawn этого сделать нельзя, ибо сигнатура не подходит:
    function spawn(command: string, args: string[], options: SpawnOptions): ChildProcess;
    Просто некуда подставить колбэк, который будет отслеживать промис
    Ответ написан
    Комментировать
  • Как сделать автозапуск pm2?

    bingo347
    @bingo347 Куратор тега Node.js
    Crazy on performance...
    pm2 save
    сохраняет информацию о текущих запущенных процессах из под текущего юзера в папке ~/.pm2
    для каждого юзера у pm2 свой список процессов и свой дамп
    Нужно выполнять каждый раз, когда поменяли список процессов и хотим при перезапуске восстанавливать в текущем состоянии

    pm2 startup
    Добавляет сам pm2 в автозагрузку, в приоритете использует system.d, при отсутствии знает еще несколько init систем.
    Нужно выполнять 1 раз, сразу после установки pm2 и из под root (sudo pm2 startup)
    В случае systemd будет создан юнит pm2-root.service и сразу будет выполнено systemctl enable pm2-root.service
    Ответ написан
    Комментировать
  • Node.js надо инсталлировать в каждый проект, или можно "извне" задавать директорию глобальных пакетов?

    bingo347
    @bingo347 Куратор тега Node.js
    Crazy on performance...
    npm по умолчанию ставит все пакеты в папку node_modules внутри папки проекта
    node.js а так же бандлеры вроде webpack или rollup по умолчанию ищут модули в папке node_modules внутри проекта
    Глобально ставить ничего не нужно, это чревато проблемами с конфликтом версий и ошибками из-за этого. Глобально можно установить только терминальные утилиты используемые вне проектов (например глобальный eslint может понадобится IDE) и вот тут как раз таки стоит заморочиться настройкой, чтоб они устанавливались и работали из папки пользователя и им не нужны были административные права для установки и обновления.
    Ответ написан
  • Как исправить эту ошибку nodejs, typescript?

    bingo347
    @bingo347 Куратор тега Node.js
    Crazy on performance...
    Нода не умеет typescript

    Вариант 1: скомпилировать
    устанавливаем:npm i typescriptи запускаем$(npm bin)/tsc examplesестественно нужен tsconfig.json
    Вариант 2: ts-node
    устанавливаем:npm i typescript ts-nodeи запускаем
    $(npm bin)/ts-node examples/upload-story.example.ts
    Ответ написан
    Комментировать
  • Как выложить проект node.js и mysql на хостинг?

    bingo347
    @bingo347 Куратор тега Node.js
    Crazy on performance...
    Классический shared хостинг как правило не поддерживает ноду, так что вариантов тут 2: или искать спец хостинг под ноду или арендовать виртуальный сервер. За сравнительно небольшие деньги сегодня можно получить или виртуалку с настоящим линуксом или OpenVZ контейнер (что в принципе то же linux, но не совсем честный).
    Разобраться, как развернуть свое окружение не особо сложно, но если совсем никак, на фрилансе и сисадмины бывают.
    Ответ написан
    9 комментариев
  • Есть ли альтернатива socket_create (php) для nodejs?

    bingo347
    @bingo347 Куратор тега Node.js
    Crazy on performance...
    Для создания сервера на базе TCP или Unix Domain Socket:
    https://nodejs.org/docs/latest/api/net.html#net_ne...
    Для создания клиента на базе TCP или Unix Domain Socket:
    https://nodejs.org/docs/latest/api/net.html#net_ne...
    Для создания UDP сокета:
    https://nodejs.org/docs/latest/api/dgram.html#dgra...
    Ответ написан
    1 комментарий
  • Как настроить livereload на node js проекте, использовав webpack-dev-server?

    bingo347
    @bingo347 Куратор тега Node.js
    Crazy on performance...
    webpack-dev-server не поддерживает hot-reload для node
    https://github.com/webpack/webpack-dev-server/blob...

    и сам hot-reload не работает "по-волшебству", просто многие лоадеры вставляют дополнительный код для его поддержки
    Ответ написан
    Комментировать
  • СМТП это сервер, который нужен для работы с модулем nodemailer на сервере сайта?

    bingo347
    @bingo347 Куратор тега Node.js
    Crazy on performance...
    SMTP - это протокол, работая на котором сервер принимает отправку почты и передает ее на целевой сервер. Не обязательно ставить его у себя. Можно использовать сторонний, например от гугла.
    SMTP сервер не знает, кому принадлежит ящик allowed@example.com, на который через него отправили почту, но он может сходить на DNS и запросить MX запись для домена example.com (запись может быть не одна, у них может быть приоритет, но можно этим особо не заморачиваться, особо сути не меняет, если сервер из самой приоритетной записи доступен, то отправка будет через него). Получив IP адрес сервера для домена, SMTP сервер пересылает письмо туда, а уже принимающий сервер по своим базам смотрит, кто есть allowed@example.com и записывает письмо ему. После чего пользователь allowed@example.com уже прочитает данные из этой базы, обращаясь к своему pop3 или imap серверу, и узнает, что у него новое письмо.
    Ответ написан
    2 комментария
  • Ошибка при импорте на node js?

    bingo347
    @bingo347 Куратор тега Node.js
    Crazy on performance...
    поменяйте "module": "CommonJS" в tsconfig
    Ответ написан
    3 комментария
  • Express + Handlebars. Как подключить шапку и футер?

    bingo347
    @bingo347 Куратор тега Node.js
    Crazy on performance...
    Ответ написан
    Комментировать
  • Как подружить backend wordpress и node pm2?

    bingo347
    @bingo347 Куратор тега Node.js
    Crazy on performance...
    Скорее всего проблема в том, что pm2 держит для каждого системного пользователя свой список задач, а у Вас вероятно php работает из под отличного юзера от того, под которым запущены нужные pm2 задачи.
    В качестве решения "в лоб" я бы предложил накатать небольшой сервис на ноде, который будет запущен из под нужного юзера тем же pm2 и будет слушать юникс сокет (ток права выдать не забудьте) или порт, а с php просто дергать его запросами
    Ответ написан
    1 комментарий
  • Как порешать эту проблемку?

    bingo347
    @bingo347 Куратор тега Node.js
    Crazy on performance...
    Вполне возможно, что connection.query из Вашей библиотеки уже умеет работать с Promise, но если это не так, то можно обернуть ее с помощью встроенной функции util.promisify:
    const {promisify} = require('util');
    const query = promisify(connection.query.bind(connection));


    А дальше все легко решается с помощью async/await:
    async function getSomethingFromDB() { // не знаю какое имя у Вас в оригинале
      const result = await query(" SELECT * FROM `tb_1` WHERE `id`=? ", [id]);
      const array = [];
      for (var i in result) {
        // ...
       const result_2 = await query(" SELECT * FROM `tb_2` WHERE `id`=? ", [id]);
        // ...
      }
    }

    P.S. я б вообще итераторами воспользовался (.map в частности) и результат бы вернул через Promise.all
    Ответ написан
    1 комментарий