2015-03-13 2 views
1

У меня есть письменная спецификация для значительной базы данных, которая будет размещаться в postgresql и использоваться как источник данных для реализации api backloop nodejs api. Проблема заключается в том, что спецификация написана никоим образом не анализируется машиной напрямую, поэтому мне придется самостоятельно создавать модели и структуру. Я только недавно начал работать с loopback, и раньше я использовал django. Из того, что я видел, я думаю, что метод, который подходит мне, - это dataSource.createModel, но этот способ не создает файлы json в папке common/model, поэтому он не будет работать на api.Loopback создает структуру базы данных, которая также создает модели json

Есть ли способ создать модели как в базе данных, так и в реестре api? это мой код до сих пор :(

var path = require('path'); 
var app = require(path.resolve(__dirname, '../server')); 
// var ds = require('../data-sources/db')('oracle'); 
var ds = app.dataSources.floatDB; 
var User = ds.createModel('User', { 
    email: { type: String, limit: 150, index: true }, 
    password: { type: String, limit: 50 }, 
    birthDate: Date, 
    registrationDate: {type: Date, default: function() { return new Date }}, 
    activated: { type: Boolean, default: false } 
}); 

ds.automigrate(function() { 
    ds.discoverModelProperties('CUSTOMER_TEST', function (err, props) { 
    console.log(props); 
    }); 
}); 

PS мои модели будут иметь внешние ключи и отношения как этого

{ 
    "name": "Order", 
    "base": "PersistedModel", 
    "properties": { 
    "description": { 
     "type": "string" 
    }, 
    "total": { 
     "type": "number" 
    } 
    }, 
    "validations": [], 
    "relations": { 
    "customer": { 
     "type": "belongsTo", 
     "model": "Customer", 
     "foreignKey": "" 
    } 
    }, 
    "acls": [], 
    "methods": [] 
} 
+0

Можете ли вы сделать этот вопрос понятным? Вы уже создали схему в своей базе данных и хотите, чтобы код генерировал конечные точки API? Или вы создаете свои модели в коде и хотите, чтобы модели JSON и схема базы данных были созданы? – conradj

ответ

0

Я сделал сценарий, который создает модель из базы данных и автоматически создает файлы .json в общем/моделях. Скрипт также предоставляет API в API-интерфейсе Explorer. Надеюсь, это вам и нужно. here

Помните о комментариях TODO, где вы должны соответствовать вашему проекту t

/** 
* loopback-discover-database.js 
* 
* Put this file in the root directory for your project and it should work. 
* run: node loopback-discover-database.js 
*/ 
var fs = require('fs'); 
var loopback = require('loopback'); 

var commonFolder = './common'; 
var modelsFolder = commonFolder+'/models'; 

//TODO: Change to the correct path for your server folder if needed 
var serverPath = './server/'; 
var modelConfig = require(serverPath + 'model-config'); 
var dataSources = require(serverPath + 'datasources'); 

//TODO: dataSourceName should be the name of your datasource in server/datasources.json 
var dataSourceName = 'dbname'; 

var ds = loopback.createDataSource('postgresql', dataSources[dataSourceName]); 

initMain(); 

function initMain(){ 
    // Check if common/models exists 
    // If not, create them and build models from database 
    if (!fs.existsSync(commonFolder)){ 
     fs.mkdirSync(commonFolder); 
    } 
    if (!fs.existsSync(modelsFolder)){ 
     fs.mkdirSync(modelsFolder); 
    } 

    discoverAndCreate(); 
} 

function discoverAndCreate(callback){ 
    //Will print the schema of the database 
    ds.discoverModelDefinitions(function (err, models) { 
    models.forEach(function (def, index, array) { 
     // def.name ~ the model name 
     ds.discoverSchema(def.name, null, function (err, schema) { 
     schema.name = schema.name.toLowerCase(); 
     fs.writeFile('common/models/'+def.name+'.json', prettyJSON(schema), function(err){ 
      if (err) throw err; 
      console.log('It\'s saved!'); 
      //If last, then save 
      if(index === array.length - 1){ 
      saveAndExposeSchemas(); 
      } 
     }); 
     addSchema(schema.name); 
     }); 
    }); 
    }); 
} 

function addSchema(schema){ 
    modelConfig[schema] = { 
    dataSource: dataSourceName, 
    public: true, 
    $promise: {}, 
    $resolved: true 
    }; 
} 

function saveAndExposeSchemas(){ 
    fs.writeFile('server/model-config.json', prettyJSON(modelConfig), function(err){ 
    if (err) throw err; 
    console.log('Schemas are exposed!'); 
    }); 
} 

function prettyJSON(str){ 
    return JSON.stringify(str, null, ' '); 
}