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

    Функция pg.any асинхронная, и как следствие res[0].error = errors; выполняется раньше обработки уникальных логинов. Чтобы работало правильно нужно отложить работу с ошибками до момента исполнения всех запросов к БД:

    User.prototype.join = function (user, res) {
        var errors = [],
            unique = [];
    
        for (var i = 0; i < user.length; i++) {
            if (user[i].required && !user[i].value) {
                errors.push('Вы не ввели логин');
            }
    
            if (user[i].unique) {
                var query = pg.any('SELECT id FROM users WHERE login=$1', [user[i].value]).then(function (user) {
                    if (user.length) {
                        errors.push('Пользователь с таким логином уже зарегистрирован');
                    }
                });
    
                unique.push(query);
            }
        }
    
        return Promise.all(unique).then(function () {
            res[0].error = errors;
        });
    };

    И отдачу роутам нужно обернуть в then:

    // неправильно
    
    join(user, res);
    // дальнейшая обработка res
    
    
    
    // правильно
    
    join(user, res).then(function () {
        // дальнейшая обработка res
    });

    Конструкция (function (i) { ... })(i); в изначальном варианте бессмысленна, потому я её убрал. А if (user[i].unique == true) { идентично if (user[i].unique) {.

    Из-за того, что я не вижу полного кода могут быть ошибки.
    Ответ написан
    1 комментарий
  • Как организовать promise в NodeJS при запросах к большому числу серверов?

    Каждый промис обращает внимание только на первый вызов resolve или reject. То есть в вашем случае при проходе по кластерам резолвится только первый. Соответственно каждый кластер требует отдельного промиса, а сам метод должен возвращать общий, который ждёт их окончания:

    dbAudit.getAllServers = function () {
    	return new Promise(function (resolve, reject) {
    		dbAudit.query('SELECT "FSDN" AS host, "Listen_Port" AS port, "Instance" AS "clusterName", "Version" AS version FROM "COLLECTE_POSTGRES"')
    			.then(function (clusters) {
    				var remotesPromises = clusters.map(function (cluster) {
    					var remote = new Sequelize('postgres', collector.user, collector.password, {
    						host: cluster.host,
    						port: cluster.port,
    						dialect: 'postgres',
    						logging: false
    					});
    
    					return getDatabases(remote);
    				});
    
    				Promise.all(remotesPromises).then(function (remotes) {
    					resolve(remotes);
    				});
    			}, reject);
    	});
    };
    
    function getDatabases(remote) {
    	return new Promise(function (resolve) {
    		remote.query("SELECT datname FROM pg_catalog.pg_database WHERE datname NOT IN ('template0','template1','postgres','repmgr')")
    			.then(function (databases) {
    				resolve({ status: 'success', databases: databases });
    			}, function (error) {
    				resolve({ status: 'error', error: error });
    			});
    	});
    }

    А так как промисы чейнятся, то можно упростить код:

    dbAudit.getAllServers = function () {
    	return dbAudit.query('SELECT "FSDN" AS host, "Listen_Port" AS port, "Instance" AS "clusterName", "Version" AS version FROM "COLLECTE_POSTGRES"')
    		.then(function (clusters) {
    			var remotesPromises = clusters.map(function (cluster) {
    				var remote = new Sequelize('postgres', collector.user, collector.password, {
    					host: cluster.host,
    					port: cluster.port,
    					dialect: 'postgres',
    					logging: false
    				});
    
    				return getDatabases(remote);
    			});
    
    			return Promise.all(remotesPromises);
    		});
    };
    
    function getDatabases(remote) {
    	return remote.query("SELECT datname FROM pg_catalog.pg_database WHERE datname NOT IN ('template0','template1','postgres','repmgr')")
    		.then(function (databases) {
    			return { status: 'success', databases: databases };
    		}, function (error) {
    			return { status: 'error', error: error };
    		});
    }
    Ответ написан
    6 комментариев
  • Как правильно составить логику асинхронной программы?

    var request = require('request');
    
    
    fetchData('site.com').then(function (data) {
      console.log(data);
    });
    
    
    function fetchData(url) {
      return fetch({ method: 'GET', url: url }).then(function (body) {
        var link = findLink(body);
    
        return link ? fetchData(link) : body;
      });
    }
    
    function fetch(options) {
      return new Promise((resolve, reject) => {
        request(options, (error, response, body) => {
          if (error) {
            reject(error);
          } else {
            resolve(body);
          }
        });
      });
    }
    
    function findLink(body) {
      // return parsed link or null
    }
    Ответ написан
  • Как сгенерировать css в нужную директорию (gulp)?

    Протестировать нет времени, но не думаю, что возникнут проблемы.

    var path = require('path'),
        gulp = require('gulp'),
        sass = require('gulp-sass'),
        rename = require('gulp-rename');
    
    gulp.task('sass', function () {
        return gulp.src('**/sass/*.scss')
            .pipe(sass())
            .pipe(rename(function (filePath) {
                filePath.dirname = path.join(filePath.dirname, '../css/');
                return filePath;
            }))
            .pipe(gulp.dest('./'));
    });
    Ответ написан
    2 комментария