-
Notifications
You must be signed in to change notification settings - Fork 15
Closed
Description
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/'));
});