LoopBack学习 之 创建应用程序

英文地址:
http://loopback.io/doc/en/lb3/Creating-an-application.html

创建应用程序

使用应用程序生成器

创建应用程序的最简单方法是使用应用程序生成器。

可以通过从头开始编写一个LoopBack应用程序,但应用程序生成器可以做所有的“繁重的”来创建标准项目布局的基本脚手架。然后,您可以使用CLI工具自定义应用程序以满足您的需求。

一般来说,文档假设您已经使用应用程序生成器创建了应用程序。

创建应用程序后,您可能需要配置它,例如:关闭堆栈跟踪,禁用API资源管理器,并检索环境变量的值。有关详细信息,请参阅 环境特定配置。

标准工程布局

应用程序生成器创建具有标准项目布局的应用程序。

总结:

  • server 目录

    • server.js - 主要应用脚本; 见下文。
    • config.json - 全局应用程序设置,如REST API根,要使用的主机名和端口等。请参阅config.json。
    • model-config.json - 将模型绑定到数据源,并指定模型是否暴露于REST之外。请参阅model-config.json。
    • datasources.json - 数据源配置文件。请参阅datasources.json。
  • client 目录(除README存根之外为空)

  • common/models目录 - 在使用模型生成器创建模型时创建。
    每个模型的JSON文件和JavaScript文件(例如my-model.json和my-model.js)。

主应用脚本(server.js)

var loopback = require('loopback');
var boot = require('loopback-boot');
var app = module.exports = loopback();
app.start = function() {
  // start the web server
  return app.listen(function() {
    app.emit('started');
    var baseUrl = app.get('url').replace(/\/$/, '');
    console.log('Web server listening at: %s', baseUrl);
    if (app.get('loopback-component-explorer')) {
      var explorerPath = app.get('loopback-component-explorer').mountPath;
      console.log('Browse your REST API at %s%s', baseUrl, explorerPath);
    }
  });
};
// Bootstrap the application, configure models, datasources and middleware.
// Sub-apps like REST API are mounted via boot scripts.
boot(app, __dirname, function(err) {
  if (err) throw err;
  // start the server if `$ node server.js`
  if (require.main === module)
    app.start();
});

环境特定配置

概观

LoopBack应用程序具有以下类型的配置文件:

  • 默认情况下, 应用范围配置文件server/config.json。您也可以使用 server/config.local.js 设置不能使用简单JSON的值。
  • 默认情况下, 数据源配置文件server/datasources.json。您也可以使用 server/datasources.local.js 设置不能使用简单JSON的值。
  • 默认情况下 ,模型的应用程序级配置server/model-config.json。
  • 中间件配置文件,默认情况下 server/middleware.json。
  • 缺省情况下 ,LoopBack组件的配置文件server/component-config.json。

注意: 使用*.js文件配置LoopBack应用程序将仅在原始.json文件保留到位时才起作用。而不是用.json文件替换文件.js ,您应该覆盖.json文件中的.js文件的值。也就是说,通过将默认.json文件保留为空,所有配置都可以在.js文件中完成。

LoopBack将始终加载以下配置文件(如果存在)

  • server/config.json。
  • server/config.local.json 或 server/config.local.js。
  • server/datasources.json
  • server/datasources.local.json 要么 server/datasources.local.js
  • server/model-config.json
  • server/model-config.local.json 要么 server/model-config.local.js
  • server/middleware.json
  • server/middleware.local.json 要么 server/middleware.local.js
  • server/component-config.json
  • server/component-config.local.json 要么 server/component-config.local.js

另外,当设置NODE_ENV环境变量时,LoopBack将从以下位置加载配置:

  • server/config.env.json/js
  • server/datasources.env.json/js
  • server/model-config.env.json/js
  • server/middleware.env.json/js
  • server/component-config.env.json/js

env NODE_ENV的值(通常是“开发”,“分期”或“生产”)在哪里 。 这使您能够为开发,分期和生产环境设置配置。

注意:
LoopBack应用程序可以加载多个可能会相互冲突的配置文件。由优先级最高的文件设置的值将始终生效。优先事项是:

  1. 环境特定的配置,基于NODE_ENV的值; 例如,server/config.staging.json。
  2. 本地配置文件 ; 例如,server/config.local.json。
  3. 默认配置文件 ; 例如,server/config.json。

应用程序配置文件示例:

config.json

{
  "host": "localhost",
  "restApiRoot": "/api",
  "host": "0.0.0.0",
  "port": 3000,
  "remoting": {
    "context": false,
    "rest": {
      "normalizeHttpPath": false,
      "xml": false
    },
    "json": {
      "strict": false,
      "limit": "100kb"
    },
    "urlencoded": {
      "extended": true,
      "limit": "100kb"
    },
    "cors": false,
    "handleErrors": false
  },
  "legacyExplorer": false
}

config.local.js

'use strict';

var GLOBAL_CONFIG = require('../global-config');

var env = (process.env.NODE_ENV || 'development');
var isDevEnv = env === 'development' || env === 'test';

module.exports = {
  hostname: GLOBAL_CONFIG.hostname,
  restApiRoot: GLOBAL_CONFIG.restApiRoot,
  livereload: process.env.LIVE_RELOAD,
  isDevEnv: isDevEnv,
  indexFile: require.resolve(isDevEnv ?
    '../client/ngapp/index.html' : '../client/dist/index.html'),
  port: GLOBAL_CONFIG.port,
  legacyExplorer: GLOBAL_CONFIG.legacyExplorer
};

数据源配置文件示例:

datasources.json

{
  "db": {
    "name": "db",
    "connector": "memory"
  }
}

datasources.production.js

// Use the same environment-based configuration as in staging
module.exports = require('./datasources.staging.js');

datasources.staging.js

module.exports = {
  db: {
    connector: 'mongodb',
    hostname: process.env.DB_HOST || 'localhost',
    port: process.env.DB_PORT || 27017,
    user: process.env.DB_USER,
    password: process.env.DB_PASSWORD,
    database: 'todo-example',
  }
};

中间件配置文件的示例:
middleware.json
http://loopback.io/doc/en/lb3/middleware.json.

{
  "initial:before": {
    "loopback#favicon": {}
  },
  "initial": {
    "compression": {},
    "cors": {
      "params": {
        "origin": true,
        "credentials": true,
        "maxAge": 86400
      }
    },
    "helmet#xssFilter": {},
    "helmet#frameguard": {
      "params": [
        "deny"
      ]
    },
    "helmet#hsts": {
      "params": {
        "maxAge": 0,
        "includeSubdomains": true
      }
    },
    "helmet#hidePoweredBy": {},
    "helmet#ieNoOpen": {},
    "helmet#noSniff": {},
    "helmet#noCache": {
      "enabled": false
    }
  },
  "session": {},
  "auth": {},
  "parse": {},
  "routes": {
    "loopback#rest": {
      "paths": [
        "${restApiRoot}"
      ]
    }
  },
  "files": {},
  "final": {
    "loopback#urlNotFound": {}
  },
  "final:after": {
    "strong-error-handler": {}
  }
}

middleware.development.json

{
  "final:after": {
    "strong-error-handler": {
      "params": {
        "debug": true,
        "log": true
      }
    }
  }
}

有关示例应用程序,请参见 https://github.com/strongloop/loopback-example-full-stack/tree/master/server

重要:
即使使用环境特定的配置文件,LoopBack仍然需要默认的基本文件。JSON文件中的空对象就足够了。

应用范围配置

在其中定义应用程序服务器端设置 server/config.json。

您可以覆盖在其中设置的值 config.json :

  • config.local.js 要么 config.local.json
  • config.env.js 或者 , (通常 或 ) 的值 在哪里 。例如。config.env.jsonenvNODE_ENVdevelopmentproductionconfig.production.json

重要提示: 附加文件可以仅使用值类型(字符串,数字)覆盖顶级键。不支持嵌套对象和数组。

例如:

config.production.js

module.exports = {
  host: process.env.CUSTOM_HOST,
  port: process.env.CUSTOM_PORT
};

确保不返回堆栈跟踪

默认情况下,JSON回应中不会返回堆栈跟踪,但如果它们已被启用进行开发和调试,请确保它们已关闭生产。

  • 将NODE_ENV环境变量设置为“production”
  • 包括以下内容 server/middleware.production.json:

server/middleware.production.json

"final:after": {
    "strong-error-handler": {}
  }

注: 该应用程序生成器创建一个middleware.developmnet.json与你的上述配置文件,因此,所有你需要做的就是确保NODE_ENV环境变量不是development。

禁用API资源管理器

当您开发应用程序时,LoopBack API Explorer非常棒,但出于安全考虑,您可能不希望在生产环境中公开它。

对于使用loopback-component-explorer的应用程序,在生产中禁用资源管理器:

  • 将NODE_ENV环境变量设置为“production”。
  • 然后在server/component-config.production.json:

server/middleware.production.json

{
  "loopback-component-explorer": null
}

在HTTP响应中包含堆栈跟踪

默认情况下,LoopBack 3.0应用程序可以从HTTP响应(典型的生产)中排除错误堆栈跟踪。对于开发和调试,您可能希望包含它们; 要这样做,设置NODE_ENV环境变量,development以便应用程序使用middleware.development.json。

该文件包括以下内容,其中包括HTTP响应中的堆栈跟踪:

{
  "final:after": {
    "strong-error-handler": {
      "params": {
        "debug": true,
        "log": true
      }
    }
  }
}

数据源配置
您可以覆盖datasources.json 以下文件中设置的值 :

  • datasources.local.js 要么 datasources.local.json
  • datasources.env.js 或者 , 环境变量(通常为 或 ) 的值 在哪里 。例如,。datasources.env.jsonenvNODE_ENVdevelopmentproductiondatasources.production.json

示例数据源:

datasources.json

{
  db: {
    connector: 'memory'
  }
}

datasources.production.json

{
  db: {
    connector: 'mongodb',
    database: 'myapp',
    user: 'myapp',
    password: 'secret'
  }
}

您还可以将文件配置为使用环境变量:datasource.env.js

datasources.production.js

module.exports = {
  db: {
    connector: 'mongodb',
    hostname: process.env.DB_HOST,
    port: process.env.DB_PORT || 27017,
    user: process.env.DB_USER,
    password: process.env.DB_PASSWORD,
    database: 'myapp',
  }

在上面的例子中,运行export PRODUCTION=true(或set PRODUCTION=trueWindows)将加载数据源。

从环境变量获取值

使用此命令设置环境变量并在一个命令中运行应用程序:

$ MY_CUSTOM_VAR="some value" node .

或单独命令:

$ export MY_CUSTOM_VAR="some value"
$ node .

那么这个变量可以作为您的应用程序使用 process.env.MY_CUSTOM_VAR。

版本化您的API 编辑这个页面

您可以根据应用程序“主要”版本轻松地将版本控制添加到REST API路由中package.json。

config.local.js 在应用程序/server目录中添加一个名称 为以下代码的文件:

/server/config.local.js

var p = require('../package.json');
var version = p.version.split('.').shift();
module.exports = {
  restApiRoot: '/api' + (version > 0 ? '/v' + version : ''),
  host: process.env.HOST || 'localhost',
  port: process.env.PORT || 3000
};

这需要从version属性中的主要版本号package.json并将其附加到REST API根目录。如果您的应用程序的主版本为0,那么REST API根目录仍然是默认的 /api。

所以,例如,如果versionin package.json是2.0.1,那么默认情况下暴露的内置模型路由为:

GET http://localhost:3000/api/Users

现在暴露在:

GET http://localhost:3000/api/v2/Users

标准项目结构 编辑这个页面

使用LoopBack的标准项目结构,以便更容易地开发和维护您的项目。
LoopBack项目文件和目录位于应用程序根目录下。在该目录中,标准的LoopBack项目结构具有以下子目录:

  • server - 节点应用程序脚本和配置文件。
  • client - 客户端JavaScript,HTML和CSS文件(仅限于LoopBack工具)。
  • common - 客户端和服务器通用的文件。 该/models子目录包含模型JSON和JavaScript文件。
  • definitions- API和产品定义YAML文件(仅限IBM API连接)。

注意: 客户端和服务器之间共享的模型JSON和JavaScript文件进入/common/models目录。仅服务器文件进入/server/models,客户端进入/client/models

顶级应用程序目录

文件或目录 描述 描述
/node-modules 目录 包含指定为依赖关系的节点包package.json。更新npm install。 N / A
package.json 标准npm包装规格。请参阅package.json。 N / A
README.md Stub文件用于内部文档。 N / A

/ server目录 - 节点应用程序文件

文件或目录 描述 描述
/boot 目录 添加脚本以执行初始化和设置。请参阅引导脚本。 脚本会按字母顺序自动执行。
/models 目录 仅限服务器的模型定义。 节点:myModel = app.models.myModelName
component-config.json 指定要加载的LoopBack组件。 仅由Strongloop工具创建。不用于API连接。
config.json 应用设置。请参阅config.json。 app.get('setting-name')
datasources.json 数据源配置文件。请参阅datasources.json。有关示例,请参阅创建新的数据源。 app.datasources['datasource-name']
middleware.json 中间件定义文件。有关详细信息,请参阅定义中间件。 N / A
middleware.development.json 具有开发配置的中间件定义文件。有关详细信息,请参阅定义中间件。请参阅准备部署。
model-config.json 型号配置文件。请参阅model-config.json。有关详细信息,请参阅将模型连接到数据源。 N / A
server.js 主应用程序文件。 N / A

/ client目录 - 客户端应用程序文件

文件或目录 描述 描述
README.md LoopBack生成器创建空README.md文件。 N / A
其他 添加您的HTML,CSS,客户端JavaScript文件。

/ common目录 - 共享应用程序文件

文件或目录 描述 描述
/models 目录 自定义模型文件:1. 模型定义JSON文件,按照约定命名model-name.json; 例如customer.json。2. 按惯例命名的自定义模型脚本model-name.js; 例如,customer.js。有关更多信息,请参阅模型定义JSON文件和自定义模型。 见下面的注释。 节点:myModel = app.models.myModelName

重要:
LoopBack 模型生成器 将骆驼壳模型名称(例如MyModel)自动转换为小写虚线名称(my-model)。例如,如果您使用模型生成器创建名为“FooBar”的模型,则会创建文件foo-bar.json并foo-bar.js输入common/models。然而,模型名称(“FooBar”)将通过模型的name属性来保留。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容