Ответы пользователя по тегу Node.js
  • Почему handlebars возвращает true?

    @de1m
    может быть из-за этой проверки?
    {{#if user.facebook}}
    Ответ написан
  • Почему возникает ошибка при подключении к socket io?

    @de1m
    Посмотрите вот этот пример. Сам по себе пример может и не очень, но сокет приделан хорошо.
    Нужно по возможности стараться использовать страндартные порты (80,443), так как все остальные могут быть заблокированны у клиента. В примере используются порты 5000,5001, но их можно легко поменять на нужные.
    Ответ написан
    Комментировать
  • Как убрать стандартное меню в новом окне?

    @de1m
    Если я правильно понял, то вам надо та строка, которя жырным написана.
    mainWindow = new BrowserWindow({
        resizable: true,
        width: 1200,
        height: 55,
        icon: __dirname + '/img/logo.png',
        autoHideMenuBar: true,
        frame: false,
        show: false
      });


    autoHideMenuBar: true
    Ответ написан
    2 комментария
  • Как уйти от callback hell в node.js?

    @de1m
    Раз тут идёт речь про всю это лапшу, то может мне кто-то может объяснить.
    У меня есть несколько слудующих друг за другом действий, причём надо дождаться, пока завершится предыдущая операция, прежде чем можно делать дальше.
    1. Проверить, работает ли ssh соеденение
    2. Проверить, работает ли ssh соеденение к другому серверу
    3. Выполнить следующий шаг

    Функция:
    backupRun.prototype.checkSSHConnection = async function (serverName) {
        var self = this;
        var exec = self.bConfig.clientserver[self.eServer]
        var client = self.bConfig.clientserver[serverName]
    
        return new Promise((resolve, reject) => {
            self.runUnderSSH("hostname", self.sshkey, exec, client)
                .then((sshOutput) => {
                    return resolve(sshOutput);
                }, (sshOutputErr) => {
                    return reject(sshOutputErr)
                })
        })
    
    };


    Чтобы пройти все три шага у меня сделанно так
    backupJob.checkSSHConnection(program.exec) //check ssh to exec server
              .then((response) => {
                logger.debug("SSH test connection to exec " + program.exec + " successfull");
    
                backupJob.checkSSHConnection(program.server) //check ssh connection to backup server
                  .then((response) => {
                    logger.debug("SSH test connection to backup server " + program.exec + " successfull");
    
                    backupJob.createBackupPrePostCommands('prerun') //create backup server prerun commands
                      .then((backupPreRun) => {
                        logger.debug("Create backup prerun commands");
                              }, (err) => {
                                logger.error("Error: config array was not generated " + err);
                              })
                          })
                      })
                  }, (error) => {
                    logger.error("SSH test connection to backup server " + program.exec + " failed: " + error);
                  })
              }, (error) => {
                logger.error("SSH test connection to exec " + program.exec + " failed: " + error);
              });


    То есть та же лапша, но только с async/await.
    Теперь собственно вопрос, можно это как-то по другому сделать или от этого никуда не уйти? Причём это всё выглядит при callback, promise и async/await примерно одинаково.
    Всю это полностью можно увидеть тут
    Ответ написан
  • Как с помощью Winston указать путь выполняемого файла в консоли?

    @de1m
    Не совсем понятен вопрос, как я понял выхотите получить путь к файлу *.js который как-раз выполняется.
    var path = require('path');
    ...
    var scriptdir = path.dirname(process.argv[1]); //get dir of scripts
    Ответ написан
  • Как запустить коллбек после асинхронных функций?

    @de1m
    В данном случае они не очень сильно помогут, там будут такие же вложения, может быть немого более читаемо.
    Я похожее делал через async/await, но там тоже надо было дождаться выполнения предыдущей команды, обработать результат и передать дальше. Тоже что-то такое получается, посмотрите вот тут с 180 строки
    Ответ написан
    Комментировать
  • Как передать параметр в Promise?

    @de1m
    Я не тестировал, но должно быть как-то так:
    var getFilename = function (partFilename) {
        return new Promise((resolve, reject) => {
            var files = fs.readdirSync(uploadPath);
            files.forEach(file => {
                var comparedPart = file.split('.')[0];
                if (comparedPart == partFilename) {
                    resolve(file);
                }
            });
            reject(new Error('404'));
        });
    }

    Но вообще, я бы асинхронную функцию тут использовал
    var getFilename = function (partFilename) {
        return new Promise((resolve, reject) => {
            var files = fs.readdir(uploadPath, (err, files) => {
                if (err) {
                    reject(new Error('404'));
                } else {
                    files.forEach(file => {
                        var comparedPart = file.split('.')[0];
                        if (comparedPart == partFilename) {
                            resolve(file);
                        }
                    });
                }
            })
        });
    }
    Ответ написан
  • Как присоединить JSON файл к JADE/PUG?

    @de1m
    Можно через
    require('./file.json')

    Либо тупа как перменную
    fs.readFile('./file.json', function read(err, data) {
    //...
    });

    Можно также readFileSync использовать.
    Ответ написан
    9 комментариев
  • Почему не запускается pm2 без root прав?

    @de1m
    тут по-моему может быть две причины
    1. Ошибка говорит, что не может подсоедениться к /home/node/.pm2/rpc.sock и ниже у вас в правах написано, что только рут может. Попробуёте перед запуском поменять права вручную на "node:node" для rpc.sock.
    2. Если у вас где-то в скрпипте открывается сетевой порт до 1024, то нужны права рут.
    Ответ написан
  • Как в linux mint установить nodejs версии > 6?

    @de1m
    Вот тут написано, как надо устанавливать.
    curl -sL https://deb.nodesource.com/setup_6.x | sudo -E bash -
    sudo apt-get install -y nodejs
    Ответ написан
  • Для каких целей используется NodeJs?

    @de1m
    Я раскажу про себя, я выбрал nodejs, потому что я могу писать небольшие программы и для винды и для линукса и если надо, то могу и какой-нибудь веб сервис сделать.
    Я например написал программу для бэкапа докера, для мониторинга докера через icinga2 или сделал вебгуи для apache derby.
    Всё пишется более или менее быстро и есть куча модулей.
    Ответ написан
    Комментировать
  • Как значение в функции сделать глобальным node.js?

    @de1m
    Через async должно работать. Надо только nodejs 7.7.4, у меня на этой версии работает.
    var output;
    var genNum = async function () {
        return new Promise((resolve, reject) => {
            setTimeout(() => {
                return resolve(Math.random())
            }, 1000)
        })
    }
    
    output = await gennum();
    console.log(output);


    Вот тут я это использовал, можете там посмотреть.
    Ответ написан
    Комментировать
  • Как быстро и эффективно освоить Node.js+Express?

    @de1m
    Я помню с похожим сталкивался, везде только какую-то часть объесняют, а целой картины как-то не получается.
    Поэтому советую сделать просто какой-то небольшой проект и нужную информацию и теорию читать по мере надобности.
    Ответ написан
    Комментировать
  • Как в библиотеке socket io понять кто вышел из сайта?

    @de1m
    При соеденении присваеваете id, что-то типа
    io.sockets.on('connection', function (socket) {
         clientid = socket.id;


    А при дисконнекте, смотрите какой id
    Ответ написан
    Комментировать
  • Как дождаться конца request?

    @de1m Автор вопроса
    Проблему я решил.
    Выгдлядит это теперь вот так:
    var req = https.request(options, function(res){
          res.on('data', function(chunk){
            resData += chunk;
          })
          res.on('end', function(){
            if (res.statusCode == "200") {
              var output = JSON.parse(resData);
              return callback(null, output.results);
            } else {
              return callback({
                "Statuscode": res.statusCode,
                "StatusMessage": res.statusMessage
              }, null);
            }
          })
        });
        req.end(JSON.stringify(filter));


    Опции и верхнюю часть в целом я не стал добавлять.
    Ответ написан
    Комментировать
  • Как собрать проект на electron?

    @de1m
    Я делал через electron-packager. Правда в конце получается папка а не exe, но там я уже думаю надо как-то по другому дальше делать.
    Ответ написан
    2 комментария
  • Node в андроид есть?

    @de1m
    Можно ещё react native использовать. На хабре была статья про него.
    Ответ написан
    Комментировать
  • Как сформулировать подключение socket.io по https и http на примере?

    @de1m
    На одном порту работать не будет, надо два порта.
    Я поменял пример, но этот у меня точно работает, всего на двух портах
    var express = require('express');  
    var app = express();  
    var server = require('http').createServer(app);  
    var io = require('socket.io')(server);
    var fs = require('fs');
    var https = require('https');
    
    app.set('views', __dirname + '/views')
    app.set('view engine', 'pug')
    app.use(express.static(__dirname + '/public'))
    
    server.listen(5000, function () {
      console.log('Server listening at port %d', 5000);
    });
    
    const opts = {
      key: fs.readFileSync('privateKey.key'),
      cert: fs.readFileSync('certificate.crt')
    }
    
    var httpsServer = https.createServer(opts, app);
    httpsServer.listen(5001, function(){
      console.log("HTTPS on port " + 5001);
    })
    
    app.get('/', function (req, res) {
      res.render('index');
    })
    
    io.attach(httpsServer);
    io.attach(server);
    
    io.on('connection', function(client) {  
        console.log('Client connected...');
        client.on('click', function(data){
          console.log(JSON.parse(data));
            setTimeout(function() {
              client.emit("ok", "data");
            }, 3000);
        })
    });


    Со стороны клиента надо добавить проверку http или https.
    if (window.location.protocol != "https:"){
            var socket = io.connect('https://localhost:5001');    
        } else {
            var socket = io.connect('http://localhost:5000');
        }
    Ответ написан
    8 комментариев
  • Как реализовывать структура скрипта с асинхронными запросами?

    @de1m
    Недавно что-то такое-же надо было. К примеру - у меня есть массив с серверами и на каждом сервере у меня есть несколько папок, которые надо проверить.
    self.startVerifyBackup(listOfServer).then(function (outArr) {
            return callback(null, outArr);
          }).catch(function (err) {
            return callback(err, null);
          });

    Здесть я передаю массив с серверам.
    Вот сама функция
    verifyBackup.prototype.startVerifyBackup = function (folderList) {
      var self = this;
    
      return Promise.all(folderList.map(function (folder) {
        return self.checkFolder(folder);
      }));
    };

    И функция которая проверяет все папки на каждом сервере
    verifyBackup.prototype.checkFolder = function (folder) {
      var self = this;
      return new Promise(function (resolve, reject) {
        if (self.config.backupserver[self.bserver].passphrase !== undefined && self.config.backupserver[self.bserver].passphrase !== null) {
          var passphrase = "PASSPHRASE=" + self.config.backupserver[self.bserver].passphrase;
        } else {
          var passphrase = "";
        }
        if (self.config.backupserver[self.bserver].tmpdir !== undefined && self.config.backupserver[self.bserver].tmpdir !== null) {
          var btemp = self.config.backupserver[self.bserver].tmpdir;
        } else {
          var btemp = "";
        }
    
        var command = "sudo " + passphrase + " duplicity verify file://" + folder + " " + btemp;
        self.runSSH(command, self.sshkeypath, self.eserver, self.bserver, function (err, data) {
          if (err) {
            return reject(err);
          } else {
    
            var output = data.toString().split("\n");
            output.splice(0, 2);
            var objReturn = {
              name: folder,
              output: output
            };
            return resolve(objReturn);
          }
        });
      });
    };


    Примерно так это должно выглядить, хотя я думаю, что у меня ошибки немного не верно обрабатываются.
    Ещё вместо promis'ов можно использовать библиотеку async. Но адепты promis'ов против, хотя там больше возможностей.
    Ответ написан
    Комментировать
  • Почему возникает ошибка?

    @de1m
    Я погуглил и погадал(приходится, так как самого кода тут вы не выложили) за вас. Может это ваш случай
    Пишут, что не хватает response.end();
    Ответ написан
    Комментировать