Skip to content

Error building when you have an autoupdate script #9

@vespertilian

Description

@vespertilian

Issue

I have an auto-update script in my loopback boot directory. When running with gulp-loopback-sdk-angular I was receiving a connection error.

node_modules/loopback-connector-postgresql/lib/postgresql.js:148
    self.pg.connect(self.clientConfig, function(err, connection, done) {
TypeError: Cannot read property 'connect' of null

Likely related to this section of code watching the datasource.

    var dataSources = app.dataSources;
      for (var dataSource in dataSources) {
        if (dataSources.hasOwnProperty(dataSource)) {
          var ds = dataSources[dataSource];
          watch(ds, 'connected', disconnectDataSource);
        }
      }

I assume that gulp-loopback-sdk-angular does not expect the boot script to fire the same event. Not sure if there is a better way to do this? Does the loopback-sdk-angular provide a 'finish' event callback that the gulp sdk could use?

My workaround for others.

Set an env variable with gulp and don't run auto-update

01_autoupdate.js (In my loopback project)

//Shared module for database models. require and execute()
var databaseModels = require('../../common/modelsToMigrate.js');
module.exports = function(app, done) {

  var postgres;

  //This build process is set when we use the gulp loopback task
  //As part of the angular SDK

  if(process.env.NODE_ENV === 'build'){
    console.log('build');
    done();
  }
  else {
    postgres = app.datasources.Postgres;
    var isTestEnv = ((process.env.NODE_ENV === 'test') ||
                     (process.env.NODE_ENV === 'unittest'));


    if(isTestEnv){
      //Database setup by each test, so don't migrate
      console.log('01_autoupdate.js skipped');
      done();
    }
    else{
      console.log('01_autoupdate.js');
      console.log('Checking if models needs updating');
      console.log(databaseModels);
      checkAndUpdateDB(done);
    }
  }

  function checkAndUpdateDB(done){

    //https://github.com/strongloop/loopback-connector-mysql/issues/118
    //Need to check for connection before trying to autoupdate
    if(postgres.connected){
      runAutoUpdate(done);
    }
    else{
      postgres.once('connected', function(){
        runAutoUpdate(done);
      });
    }
  }

  function runAutoUpdate(done){
    postgres.isActual(databaseModels, function(err, actual) {
      if(err) {
        console.log('Is actual' + err);
        throw err;
      }
      if (!actual) {
        console.log('Models need updating');
        postgres.autoupdate(databaseModels, function(err, result) {
          if(err) {
            console.log('Models need updating' + err);
            throw err;
          }
          console.log('autoupdate succeeded');
          done();
        });
      }
      else{
        console.log('Models do not need updating');
        done();
      }
    });
  }
};

gulp task config (In my Angular project)

var gulp = require('gulp');
var rename = require('gulp-rename');
var debug = require('gulp-debug');
var loopbackAngular = require('gulp-loopback-sdk-angular');


gulp.task('loopback', ['set-env-build', 'loopback-create']);

gulp.task('set-env-build', function(){
  return process.env.NODE_ENV = 'build';
});

gulp.task('loopback-create', function () {
  return gulp.src('../business_of_banking/server/server.js')
    .pipe(loopbackAngular())
    .pipe(rename('lb-services.js'))
    .pipe(gulp.dest('src/vendor/'));
});

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions