Ответы пользователя по тегу Node.js
  • Как установить запрет на использование post и put в express.js?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Что нибудь вроде такого:
    const mysql = require('some-mysql-library');
    const app = express();
    // ...
    function getUserFromMysqlMiddleware(req, res, next) {
      mysql.query('SELECT * FROM `users` WHERE `id`=? LIMIT 1', [req.query.userid]).then(([user]) => {
        if(!user) {
          const err = new Error('Access denied');
          err.status = 403;
          return next(err);
        }
        req.user = user;
        next();
      }).catch(next);
    }
    app.post('/some/route', getUserFromMysqlMiddleware, (req, res) => {
      // Ваш код с гарантированным наличием req.user
    });
    app.put('/some/route', getUserFromMysqlMiddleware, (req, res) => {
      // Ваш код с гарантированным наличием req.user
    });
    Ответ написан
    Комментировать
  • Как лучше передавать данные между локальными приложениями nodejs?

    bingo347
    @bingo347 Куратор тега Node.js
    Crazy on performance...
    Вариант 1: написать микросервис, который поднимет сервер на unix-socket и будет просто проксировать все данные из каждого соединения во все остальные.
    Вариант 2: не городить своих велосипедов и использовать redis pub/sub или аналоги.
    Вариант 3: не городить своих велосипедов и использовать любую очередь сообщений, например ZeroMQ
    Ответ написан
  • Почему не запускается exe файл игры?

    bingo347
    @bingo347 Куратор тега Node.js
    Crazy on performance...
    проблема в параметре cwd (рабочая директория)
    https://nodejs.org/dist/latest-v12.x/docs/api/chil...
    При создании ярлыка проводником windows (и многими другими файл менеджерами) этот параметр прописывается в ярлыке по умолчанию как папка содержащая указанный .exe
    В ноде же по умолчанию этот параметр берется из process.cwd()
    https://nodejs.org/dist/latest-v12.x/docs/api/proc...
    что соответствует рабочей папке Вашего node процесса

    я не до конца понимаю, для чего он нужен в принципе
    он задает "рабочую директорию процесса", все относительные пути используемые в запускаемой программе будут вычислены относительно этой директории
    Ответ написан
    Комментировать
  • Как реализовать обмен данными между Node js и php?

    bingo347
    @bingo347 Куратор тега Node.js
    Crazy on performance...
    На мой взгляд самое правильное - делать из ноды запросы к php-fpm. Он общается по давольно стандартизированному протоколу fast-cgi, для которого на npm можно найти клиент, например вот: https://www.npmjs.com/package/fastcgi-client
    Ответ написан
    Комментировать
  • Как решить задачу с минимальным использованием памяти?

    bingo347
    @bingo347 Куратор тега Node.js
    Crazy on performance...
    Готовлюсь к собесу в яндекс
    Рано Вам в Яндекс... задачка то уровня школьных олимпиад...
    Постарайтесь, чтобы решение работало за время k ⋅ log(k) ⋅ n
    А это точно задачка для Яндекса? Она решается за линейное время O(k ⋅ n) если чуть-чуть вникнуть в условия, а логарифмическое решение годно лишь для людей с ЕГЭ головного мозга, там как раз любят решения в стиле "слить все в 1 массив и отсортировать", при использовании qsort/merge-sort как раз будет O(k ⋅ log(k) ⋅ n)

    Если читать из файла по 2 байта, то можно значительно сэкономить память, для формата 1- и 2-значные числа разделенные пробелом этого более чем достаточно.
    Так же выходной массив можно не формировать, а сразу отдавать его на выход.
    P.S. гуглите сортировку подсчетом, а решать задачу за Вас на тостере никто не будет
    Ответ написан
    5 комментариев
  • Как подключиться по ssh к серверу и отобразить выполняющийся скрипт nodejs?

    bingo347
    @bingo347 Куратор тега Node.js
    Crazy on performance...
    + к другим ответам, конкретно для ноды есть еще решение:
    Запускать через pm2 и потом смотреть логи тоже через него
    Ответ написан
    Комментировать
  • Как сделать нагрузочное тестирование веб-сервера для сравнения PHP+Nginx vs Node.js?

    bingo347
    @bingo347 Куратор тега Node.js
    Crazy on performance...
    В плане отдачи статики - врядли Ваш код хоть на php хоть на node сможет тягаться по скорости с Nginx, иначе Вы не задавали бы подобные вопросы. В любом случае стоит ставить nginx перед любым бэкендом, хоть php хоть node. Помимо раздачи статики еще получите и нормальную работу с tls и балансировку.
    По динамике:
    php - работает только в режиме 1 запрос = 1 процесс, соответственно процессов в памяти будет больше, а значит и больше памяти потребуется и больше процессорного времени будет уходить на switch-context. Так же и очередь ожидающих запросов будет больше ибо php работает синхронно, а это значит что при ожидании io (файлы/бд) Ваш процесс в idle. Самый быстрый вариант сейчас с php-fpm, который работает по протоколу fastcgi и держит пул предзапущенных потоков php. Так же возможна работа по http с apache, но этот вариант явно медленнее и тяжелее чем php-fpm.
    node - может обрабатывать много запросов в 1 процессе засчет асинхронной модели выполнения, соответственно Вам может хватить небольшого количества процессов для очень большой нагрузки. Можно работать с nginx как по протоколу http (есть из коробки) так и fastcgi (при этом по прежнему имея 1 процесс)

    Теперь по нагрузочному тестированию, нужно хорошо разбираться в обоих тестируемых технологиях, знать о возможных оптимизациях и как их обойти. И даже при всем этом Вы не получите адекватных результатов на синтетических примерах... Можно сравнить решение конкретной задачи, но для этого придется разработать решение на обоих технологиях, а оно Вам надо? БольшАя часть задержек в большинстве веб-сервисов падает на базу данных, которая особо не зависит от выбранного ЯП, хотя асинхронная модель тут предпочтительнее...
    Так что пишите на чем умеете
    Ответ написан
    1 комментарий
  • Как правильно вывести меню из бд?

    bingo347
    @bingo347 Куратор тега Node.js
    Crazy on performance...
    connection.query('SELECT * FROM menu', (err, result) => {
      if(err) {
        console.error(err);
        return;
      }
      const index = result.reduce((acc, row) => ({...acc, [row.id]: row}), {});
      const menu = [];
      for(const row of result) {
        if(row.parent_id === 0) {
          menu.push(row);
          continue;
        }
        const parent = index[row.parent_id];
        if(!parent) {
          console.warn(`Undefined parent with id ${row.parent_id}`);
          continue;
        }
        if(!parent.children) {
          parent.children = [];
        }
        parent.children.push(row);
      }
      console.log(menu);
    });
    Ответ написан
  • Как работать с node_modules на mac и windows одновременно?

    bingo347
    @bingo347 Куратор тега Node.js
    Crazy on performance...
    Без git (или другой vsc) нормально поработать с нескольких машин не выйдет

    А так, кидаем node_modules, dist и прочие генерируемые и env-зависимые файлы и папки в .gitignore и прекрасно можно работать с любого количества машин с любыми ОС.
    Я сам так работаю: Win10+WSL дома, osX на макбуке - походный вариант для работы из кафе/из такси, LMDE в офисе. И никаких проблем нет, если технология кросплатформенная, каковой нода и является.

    P.S. как можно работать без git? а откатится как если что? а фичи по веткам раскидать, чтоб при необходимости хотфикса прод не сломался?
    Ответ написан
  • Как загрузить файл на node.js сервер без сторонних библиотек?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    В данном случае файл отправляется в теле запроса как есть, без всяких оберток:
    file_load.onsubmit = function(){
      var file = this.elements.myfile.files[0];
      var xhr = new XMLHttpRequest();
      xhr.open("POST", "upload", true);
      xhr.send(file);
      return false;
    }


    Следовательно на сервере нам достаточно перенаправить тело запроса целиком в файл:
    const server = require('http').createServer();
    const fs = require('fs');
    const nodeStatic = require('node-static');
    const file = new nodeStatic.Server('.', {
      cache: 0
    });
    
    server.listen(3000, () => console.log("сервер запущен"));
    server.on('request', (req, res) => {
      if (req.url == '/upload') {
        req.pipe(
          fs.createWriteStream('file2.jpg')
        ).on('finish', () => res.end('ok'));
        return;
      }
      file.serve(req, res);
    });
    Ответ написан
    1 комментарий
  • Как написать простой ajax запрос на nodejs?

    bingo347
    @bingo347 Куратор тега Node.js
    Crazy on performance...
    Низкоуровневое апи: https://nodejs.org/dist/latest-v12.x/docs/api/http...
    fetch (как в браузере): https://www.npmjs.com/package/node-fetch
    axios предложили уже выше, но на мой взгляд единственный его + в универсальности (с чем fetch как по мне лучше справляется), зато из минусов - тяжелый, тормазной...
    Ну и наконец request - очень хорошая абстракция над низкоуровневым апи ноды - https://www.npmjs.com/package/request - из минусов - нет промисов из коробки
    Ответ написан
    Комментировать
  • Как сделать что-бы webpack делил порт с node.js?

    bingo347
    @bingo347 Куратор тега Node.js
    Crazy on performance...
    Сам webpack никаких портов не слушает, он просто собирает Ваше приложение из много файлов в мало файлов, сеть ему для этого не нужна.
    Сеть может слушать webpack-dev-server, который просто является оберткой над express + webpack-dev-middleware.

    Так что никто Вам не мешает самому запустить express и засунуть в него webpack-dev-middleware, получив тот же эффект + расширяемость express приложения

    А при желании избавится и от express, Вам достаточно будет сэмулировать next колбэк и можете передавать в мидлвар нативные request и response из http модуля
    Ответ написан
    Комментировать
  • Как извлечь три ветви JSON?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    response.items[0].id
    у Вас items - массив, в котором уже лежит объект с полем id
    Ответ написан
    3 комментария
  • Vue.js, React или Angular? Express на Electron JS будет работать?

    bingo347
    @bingo347 Куратор тега Node.js
    Crazy on performance...
    Vue.js, React или Angular?
    что знаете, то и берите...
    Далее все это запихну в Express.
    express это про создание тормознутых веб-серверов, у электрона есть более эфективное апи для этого:
    https://electronjs.org/docs/api/protocol
    https://electronjs.org/docs/api/ipc-main
    https://electronjs.org/docs/api/ipc-renderer
    Ответ написан
    Комментировать
  • Как правильно получать пакеты через node.js tcp сервер?

    bingo347
    @bingo347 Куратор тега Node.js
    Crazy on performance...
    Может стоит внимательно читать доку?
    https://nodejs.org/api/buffer.html#buffer_buffers_...
    'ascii' - For 7-bit ASCII data only. This encoding is fast and will strip the high bit if set.

    ясно же написано, 7-битная кодировка, старший бит срезается, что и происходит в Вашем случае
    Ответ написан
    2 комментария
  • Почему node js не видит установленные пакеты npm?

    bingo347
    @bingo347 Куратор тега Node.js
    Crazy on performance...
    Вариант 1:
    PATH="$PWD/node_modules/.bin:$PATH" postcss --params

    Вариант 2:
    прописываем команду в секции scripts package.json и запускаем через npm run
    {
      "scripts": {
        "postcss": "postcss --params"
      }
    }
    npm run postcss
    вариант 3:
    запустить пакет через npx, для этого даже установки не требуетсяnpx postcss --params
    Ответ написан
    Комментировать
  • Как я могу сделать скриншот страницы сайта на Node.js?

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

    bingo347
    @bingo347 Куратор тега Node.js
    Crazy on performance...
    var express = require("express");
    var app = express();
    var server = require('http').createServer(app);
    var io = require('socket.io').listen(server);
    
    app.get('/bootstrap.min.css', (function() {
      // на другой машине bootstrap может установится в другое место
      // разрезолвим его путь средствами ноды и сохраним в замыкании
      var cssFile = require.resolve('bootstrap/dist/css/bootstrap.min.css');
      return function(req, res) {
        res.sendFile(cssFile);
      };
    })());
    
    app.get('/', function(request, response){
      response.sendFile(__dirname + "/index.html");
    });
    
    server.listen(3000);

    ну и в html теперь путь поправим:<link rel="stylesheet" href="/bootstrap.min.css">
    Ответ написан
    1 комментарий
  • Как распределить дочерние процессы по всем ядрам?

    bingo347
    @bingo347 Куратор тега Node.js
    Crazy on performance...
    Если linux, то taskset
    На других ядрах (BSD, Darwin, WinNT), нужно погуглить аналоги

    А вообще, большого смысла привязываться к конкретным ядрам нет, Ваш процесс не единственный в системе, почему бы не доверить распределение по ядрам самой ОС? switch-context все равно будет, ибо помимо ваших 3х процессов будет еще несколько сотен других, не говоря уже о том, что многие из них многопоточные.

    А еще вот о чем подумайте, нода не такая уж и однопоточная. Помимо 1 потока v8 (а начиная с 10 ноды и их может быть несколько), у Вас еще от 4 до 128 потоков libuv (ибо сеть то может работать асинхронно, а вот с файловой системой приходится асинхронщину на потоках эмулировать). А еще могут быть C++ аддоны, которые порождают свои потоки. И стоит ли все это добро привязывать к 1 единственному ядру?
    Ответ написан
    Комментировать
  • Как изменить картинку в node.js по ссылке?

    bingo347
    @bingo347 Куратор тега Node.js
    Crazy on performance...
    const fs = require('fs');
    const {request} = require('https');
    
    request('https://sun1-17.userapi.com/c855128/v855128790/41b1f/gNXADknpXlk.jpg', res => {
      res.on('error', console.error).pipe(fs.createWriteStream('/path/to/file/for/save.jpg'));
    }).on('error', console.error).end();
    Ответ написан
    3 комментария