UNPKG

waterline

Version:

An ORM for Node.js and the Sails framework

209 lines (163 loc) 6.1 kB
#!/usr/bin/env node /** * Module dependencies */ var util = require('util'); var _ = require('@sailshq/lodash'); var SailsDiskAdapter = require('sails-disk'); var Waterline = require('../../'); /** * `raw-example.js` * * This is an example demonstrating how to use Waterline * from a vanilla Node.js script. * * * To run this example, do: * ``` * node example/raw/raw-example * ``` */ // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // // NOTE: The `machine-as-script` package, like Sails, takes care of all this kind of // stuff automatically, including bootstrapping the ORM in the context of a Sails app. // (For deets, see https://npmjs.com/package/machine-as-script) // // But since we're doing this vanilla-style, we'll kick things off by calling a self-invoking // function here. This just lets us avoid repeating ourselves and gives us a level of control // over logging. See the two callbacks below in order to better understand how it works. // // > To read more general tips about managing flow and exposing customizable logic via // > self-invoking functions in Node.js apps/scripts, check out: // > https://www.npmjs.com/package/parley#flow-control // // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - (function (handleLog, done){ // Set up Waterline. Waterline.start({ adapters: { 'sails-disk': SailsDiskAdapter, // ...other Waterline-compatible adapters (e.g. 'sails-mysql') might go here }, datastores: { default: { adapter: 'sails-disk' } }, models: { user: { datastore: 'default', attributes: { id: { type: 'number', autoMigrations: { autoIncrement: true } }, numChickens: { type: 'number' }, pets: { collection: 'pet' } }, primaryKey: 'id', schema: true }, pet: { datastore: 'default', attributes: { id: { type: 'number', autoMigrations: { autoIncrement: true } }, name: { type: 'string' } }, primaryKey: 'id', schema: true } } }, function whenWaterlineIsReady (err, orm) { if (err) { return done(new Error('Could not start up Waterline ORM: '+err.stack)); }//--• // Now kick off another self-invoking function. // (Once again, this is just to avoid repeating ourselves.) (function (proceed){ handleLog(); handleLog(); handleLog('--'); handleLog('Waterline ORM is started and ready.'); // Get access to models: var Pet = Waterline.getModel('pet', orm); var User = Waterline.getModel('user', orm); handleLog(); handleLog('(this is where you could write come code)'); // ...for example, like this: handleLog( '\n'+ '\n'+ '==========================================================================\n'+ '• EXAMPLE: Calling some model methods: •\n'+ '==========================================================================\n' ); var PET_NAMES = ['Carrie', 'Samantha', 'Charlotte', 'Miranda', 'Mr. Big']; Pet.createEach([ { name: _.random(PET_NAMES) }, { name: _.random(PET_NAMES) } ]) .meta({fetch: true}) .exec(function (err, pets) { if (err) { return proceed(new Error('Failed to create new pets: '+err.stack)); } User.create({ numChickens: pets.length, pets: _.pluck(pets, 'id') }) .exec(function (err) { if (err) { return proceed(new Error('Failed to create new user: '+err.stack)); } User.stream() .populate('pets') .eachRecord(function eachRecord(user, next){ handleLog('Streamed record:',util.inspect(user,{depth: null})); return next(); }) .exec(function afterwards(err) { if (err) { return proceed(new Error('Unexpected error occurred while streaming users:',err.stack)); } return proceed(); });//</ User.stream().exec() > });//</ User.create().exec() > });//</ Pet.createEach().exec() > })(function (err){ if (err) { Waterline.stop(orm, function(secondaryErr) { if (secondaryErr) { handleLog(); handleLog('An error occurred, and then, when trying to shut down the ORM gracefully, THAT failed too!'); handleLog('More on the original error in just a while.'); handleLog('But first, here\'s the secondary error that was encountered while trying to shut down the ORM:\n', secondaryErr); handleLog('... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... '); return done(err); }//-• return done(err); });//_∏_ return; }//-• // IWMIH, everything went well. handleLog(); handleLog('Done. (Stopping ORM...)'); handleLog('... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... '); Waterline.stop(orm, function(secondaryErr) { if (secondaryErr) { return done(new Error('Everything else went fine, but then when attempting to shut down the ORM gracefully, something went wrong! Details:'+secondaryErr.stack)); } return done(); }); });//</ inner self-invoking function> });//</ Waterline.start() > })( function handleLog(){ console.log.apply(console, Array.prototype.slice.call(arguments)); }, function whenFinishedAndORMHasBeenStopped(err){ if (err) { console.log(); console.log(err.stack); console.log(); console.log(' ✘ Something went wrong.'); console.log(' (see stack trace above)'); console.log(); return process.exit(1); }//-• console.log(); console.log(' ✔ OK.'); console.log(); return process.exit(0); } );//</ outer self-invoking function>