Node.js學(xué)習(xí):使用Loopback3.0構(gòu)建應(yīng)用程序(一)

一、安裝

安裝LoopBack工具來創(chuàng)建和開發(fā)LoopBack 3.0應(yīng)用程序笑撞。

安裝Node.js

node下載地址

安裝loopback工具

雖然你可以自己從頭開始編寫一個(gè)LoopBack應(yīng)用程序,但是安裝一個(gè)LoopBack CLI工具能夠使它更容易入門骂删。它將構(gòu)建應(yīng)用程序的基本結(jié)構(gòu)赞草,然后您可以根據(jù)需要進(jìn)行自定義。

LoopBack提供了兩個(gè)工具的選項(xiàng):LoopBack CLIIBM API Connect開發(fā)工具包祭刚,這里可以選擇LoopBack CLI來進(jìn)行應(yīng)用程序的構(gòu)建。

安裝Loopback CLI工具

npm install -g loopback-cli

這一步將安裝 lb 命令行工具墙牌,用于構(gòu)建和修改LoopBack應(yīng)用程序涡驮。

安裝更新

如果之前安裝過strongloop,需要進(jìn)行一次版本的更新:

npm install -g strongloop

如果遇到任何問題喜滨,可以嘗試卸載重裝:

npm uninstall -g strongloop
npm cache clear
npm install -g strongloop

二遮怜、使用Loopback創(chuàng)建一個(gè)應(yīng)用

創(chuàng)建一個(gè)簡單的API

首先使用loopback-cli創(chuàng)建一個(gè)新的應(yīng)用:

lb

LoopBack應(yīng)用生成器將提示您輸入應(yīng)用程序的名稱。

     _-----_
    |       |    .--------------------------.
    |--(o)--|    |  Let's create a LoopBack |
   `---------′   |       application!       |
    ( _′U`_ )    '--------------------------'
    /___A___\
     |  ~  |
   __'.___.'__
 ′   `  |° ′ Y `
[?] What's the name of your application? loopback-getting-started
[?] Enter name of the directory to contain the project: loopback-getting-started

這里可以替換成任何你喜歡的名字鸿市,本教程使用了官方文檔中的名稱:loopback-getting-started锯梁。

接下來cli工具會(huì)詢問要?jiǎng)?chuàng)建什么樣的應(yīng)用程序:可以選擇 hello-world

? What kind of application do you have in mind? (Use arrow keys)
  api-server (A LoopBack API server with local User auth)
  empty-server (An empty LoopBack API, without any configured models or datasources)
? hello-world (A project containing a controller, including a single vanilla Message and
    a single remote method)
  notes (A project containing a basic working example, including a memory database)  

然后焰情,生成器將在其構(gòu)建應(yīng)用程序時(shí)創(chuàng)建如下信息陌凳,包括:

  1. 初始化項(xiàng)目的文件夾結(jié)構(gòu)。
  2. 創(chuàng)建默認(rèn)的JSON文件内舟。
  3. 創(chuàng)建默認(rèn)的JavaScript文件合敦。
  4. 下載并安裝依賴節(jié)點(diǎn)模塊(省去手動(dòng)安裝npm的一步)。

創(chuàng)建一個(gè)數(shù)據(jù)模型

完成了初始項(xiàng)目的構(gòu)建验游,接下來我們將創(chuàng)建一個(gè)自動(dòng)具有REST API接口的CoffeeShop模型充岛。

進(jìn)入應(yīng)用程序目錄,然后運(yùn)行LoopBack模型生成器:

lb model

生成器將提示輸入數(shù)據(jù)模型的名稱耕蝉,輸入CoffeeShop:

[?] Enter the model name: CoffeeShop

它會(huì)詢問您是否要將模型附加到已經(jīng)一些已經(jīng)定義的數(shù)據(jù)源崔梗。 此時(shí),只有默認(rèn)的內(nèi)存數(shù)據(jù)源可用垒在。按Enter鍵選擇它:

...
[?] Select the data-source to attach CoffeeShop to: (Use arrow keys)
? db (memory)

然后蒜魄,生成器將提示您使用基類作為模型。由于您在最終會(huì)把該模型連接到數(shù)據(jù)庫中的持久數(shù)據(jù)源,所以這里選擇PersistedModel:

[?] Select model's base class: (Use arrow keys)
  Model
? PersistedModel
  ACL
  AccessToken
  Application
  Change
  Checkpoint

PersistedModel是連接到持久性數(shù)據(jù)源(如數(shù)據(jù)庫)的所有模型的基礎(chǔ)對(duì)象谈为,也就是基類旅挤。

關(guān)于Loopback中的模型:

模型是LoopBack的核心,表示如數(shù)據(jù)庫或其他后端服務(wù)(REST伞鲫,SOAP等)等后端數(shù)據(jù)源粘茄。 LoopBack模型是具有Node和REST API的JavaScript對(duì)象。

LoopBack的一個(gè)關(guān)鍵功能是當(dāng)您定義一個(gè)模型時(shí)秕脓,它將自動(dòng)附帶預(yù)定義的REST API驹闰,并具有完整的創(chuàng)建,讀取撒会,更新和刪除操作。

Basic模型對(duì)象具有添加鉤子和驗(yàn)證數(shù)據(jù)的方法师妙。其他模型對(duì)象都“繼承”它诵肛。模型具有繼承層次結(jié)構(gòu),如下圖所示:將模型附加到持久性數(shù)據(jù)源時(shí)默穴,它將成為具有創(chuàng)建怔檩,檢索,更新和刪除操作的連接模型蓄诽。 LoopBack的內(nèi)置模型繼承自它薛训。

model的繼承關(guān)系

LoopBack的強(qiáng)大優(yōu)點(diǎn)之一是它自動(dòng)為您的模型生成REST API。生成器將詢問您是否要公開此REST API仑氛。

再次輸入Enter接受默認(rèn)值乙埃,并通過REST暴露CoffeeShop模型:

[?] Expose CoffeeShop via the REST API? (Y/n) Y

LoopBack使用模型名稱的復(fù)數(shù)自動(dòng)創(chuàng)建與模型關(guān)聯(lián)的REST路由。默認(rèn)情況下锯岖,它將您的名稱復(fù)數(shù)(通過添加“s”)介袜,但是如果需要,您可以指定自定義復(fù)數(shù)形式出吹。

按Enter接受默認(rèn)復(fù)數(shù)形式(CoffeeShops):

[?] Custom plural form (used to build REST URL):

接下來遇伞,系統(tǒng)會(huì)詢問您是要僅在服務(wù)器上創(chuàng)建模型,還是在/common目錄中創(chuàng)建模型捶牢,這些模型可能由服務(wù)器端口和客戶端LoopBack API使用鸠珠。選擇common,即使在這個(gè)應(yīng)用程序中秋麸,你只使用服務(wù)器端模型:

? Common model or server only?
? common
  server

每個(gè)模型都有屬性〗ヅ牛現(xiàn)在,您將為CoffeeShop模型定義一個(gè)屬性“name”灸蟆。

選擇字符串作為屬性類型:

Let's add some CoffeeShop properties now.
Enter an empty property name when done.
[?] Property name: name
   invoke   loopback:property
[?] Property type: (Use arrow keys)
? string
  number
  boolean
  object
  array
  date
  buffer
  geopoint
  (other)

每個(gè)屬性可以是可選的或必需的飞盆。輸入 y 以將 name 設(shè)為必需:

[?] Required? (y/N)

然后系統(tǒng)會(huì)提示您輸入屬性的默認(rèn)值;按Enter鍵不設(shè)默認(rèn)值:

? Default value[leave blank for none]:

然后,系統(tǒng)會(huì)提示您添加其他屬性。按照提示添加名為“city”的必需屬性吓歇。

Let's add another CoffeeShop property.
? Property name: city
? Property type: string
? Required? Yes
? Default value[leave blank for none]:

當(dāng)提示輸入下一個(gè)屬性的名稱時(shí)孽水,按Enter鍵結(jié)束模型創(chuàng)建過程。

模型生成器將在應(yīng)用程序的 common / models 目錄中創(chuàng)建兩個(gè)定義模型的文件: coffee-shop.jsoncoffee-shop.js城看。

LoopBack模型生成器自動(dòng)將駝峰式的模型名稱(例如MyModel)轉(zhuǎn)換為小寫字母名稱(my-model)女气。例如,如果您使用模型生成器創(chuàng)建一個(gè)名為“FooBar”的模型测柠,它將在 common/models 中創(chuàng)建foo-bar.jsonfoo-bar.js文件炼鞠。但是,模型名稱(“FooBar”)將通過模型的名稱屬性進(jìn)行保留轰胁。

運(yùn)行應(yīng)用程序

$ node .
...
Browse your REST API at http://0.0.0.0:3000/explorer
Web server listening at: http://0.0.0.0:3000/

現(xiàn)在打開你的瀏覽器到http://0.0.0.0:3000/explorerhttp://localhost:3000/explorer 谒主。您將看到StrongLoop API資源管理器:

通過使用LoopBack的一系列簡單的步驟,您創(chuàng)建了一個(gè)CoffeeShop模型并為它設(shè)置了一些屬性赃阀,然后通過REST進(jìn)行公開霎肯。

三、使用API??資源管理器

運(yùn)行API??資源管理器

運(yùn)行應(yīng)用: node .

轉(zhuǎn)到 http://localhost:3000/explorer榛斯。您將看到StrongLoop API資源管理器中顯示了該應(yīng)用程序的兩個(gè)模型:User和CoffeeShop:

探索CoffeeShop模型

除了CoffeeShop模型之外观游,Loopback還會(huì)為每個(gè)應(yīng)用程序生成默認(rèn)的用戶模型及其接口。

展開CoffeeShops之后驮俗,可以看到它所有的API接口懂缕。

大致瀏覽這些API接口:您可以看到它們涵蓋了所有的創(chuàng)建,讀取王凑,更新和刪除(CRUD)等操作搪柑。你可以去post一條數(shù)據(jù)來試試看。

四索烹、將API連接到數(shù)據(jù)源

添加一個(gè)數(shù)據(jù)源

現(xiàn)在拌屏,您將使用數(shù)據(jù)源生成器定義數(shù)據(jù)源:

$ lb datasource

生成器將提示您命名數(shù)據(jù)源:

[?] Enter the data-source name:

接下來,生成器將提示您輸入數(shù)據(jù)源的類型术荤,這里以mySql為例:

? Select the connector for mysqlDs: (Use arrow keys)
? In-memory db (supported by StrongLoop)
  IBM DB2 (supported by StrongLoop)
  IBM DashDB (supported by StrongLoop)
  IBM MQ Light (supported by StrongLoop)
  IBM Cloudant DB (supported by StrongLoop)
  IBM DB2 for z/OS (supported by StrongLoop)
  MongoDB (supported by StrongLoop)
(Move up and down to reveal more choices)

然后該工具將提示您輸入數(shù)據(jù)源配置倚喂,對(duì)于MySQL,您可以以URL格式或單獨(dú)輸入所有設(shè)置瓣戚。

Connector-specific configuration:
? Connection String url to override other settings (eg: mysql://user:pass@host/db):

按回車鍵跳過端圈。

提示:盡量使用自己的MySQL數(shù)據(jù)庫服務(wù)器,并創(chuàng)建一個(gè)名為“getting_started”的新數(shù)據(jù)庫子库,數(shù)據(jù)庫名稱可以自己定義舱权,但是請(qǐng)確保datasources.json中的mysqlDs.database屬性與之匹配。

如果沒有仑嗅,您可以使用在demo.strongloop.com上運(yùn)行的StrongLoop MySQL服務(wù)器宴倍。但它是一個(gè)共享資源张症,兩個(gè)用戶可能會(huì)同時(shí)運(yùn)行創(chuàng)建樣本數(shù)據(jù)的腳本,這可能會(huì)引發(fā)沖突鸵贬。因此俗他,我們建議您使用自己的MySQL服務(wù)器。

如果使用StrongLoop MySQL服務(wù)器阔逼,請(qǐng)輸入如下所示的設(shè)置兆衅。如果使用您自己的MySQL服務(wù)器,請(qǐng)輸入服務(wù)器的主機(jī)名嗜浮,端口號(hào)和登錄信息羡亩。

? host: demo.strongloop.com
? port: 3306
? user: demo
? password: L00pBack
? database: getting_started
? Install loopback-connector-mysql@^2.2 Yes

當(dāng)工具提示您安裝連接器時(shí),運(yùn)行npm install loopback-connector-mysql --save危融。該工具還將數(shù)據(jù)源定義添加到server/datasources.json文件中畏铆,如下所示。請(qǐng)注意剛剛添加的“mysqlDs”數(shù)據(jù)源吉殃,以及名為“db”的內(nèi)存數(shù)據(jù)源辞居,默認(rèn)情況下是這樣。

/server/datasources.json

{
  "db": {
    "name": "db",
    "connector": "memory"
  },
  "mysqlDs": {
      "host": "demo.strongloop.com",
      "port": 3306,
      "url": "",
      "database": "getting_started",
      "password": "L00pBack",
      "name": "mysqlDs",
      "user": "demo",
      "connector": "mysql"
    }
}

將CoffeeShop模型連接到MySQL

現(xiàn)在你創(chuàng)建了一個(gè)MySQL數(shù)據(jù)源寨腔,并且有一個(gè)CoffeeShop模型,接下來需要把它們聯(lián)系起來率寡。LoopBack應(yīng)用程序使用model-config.json文件將模型鏈接到數(shù)據(jù)源迫卢。編輯/server/model-config.json并查找CoffeeShop條目:

/server/model-config.json

...
  "CoffeeShop": {
    "dataSource": "db",
    "public": true
  }
  ...

把dataSource屬性從db更改為mysqlDs。使CoffeeShop模型附加到剛剛創(chuàng)建和配置的MySQL數(shù)據(jù)源:

/server/model-config.json

...
  "CoffeeShop": {
    "dataSource": "mysqlDs",
    "public": true
  }
  ...

添加一些測試數(shù)據(jù)

現(xiàn)在LoopBack中已經(jīng)有了一個(gè)CoffeeShop模型冶共,如何在MySQL數(shù)據(jù)庫中創(chuàng)建相應(yīng)的表乾蛤?

您可以直接嘗試執(zhí)行一些SQL語句,不過LoopBack提供了一個(gè)Node API捅僵,可以自動(dòng)執(zhí)行一個(gè)稱作auto-migration的程序家卖。

loopback-getting-started模塊包含用于演示自動(dòng)遷移的create-sample-models.js腳本。

注意:以下自動(dòng)遷移腳本是在應(yīng)用程序初始啟動(dòng)時(shí)LoopBack執(zhí)行的引導(dǎo)腳本的示例庙楚。使用引導(dǎo)腳本進(jìn)行初始化上荡,并執(zhí)行應(yīng)用程序啟動(dòng)時(shí)執(zhí)行的任何其他邏輯。

/server/boot/create-sample-models.js

module.exports = function(app) {
  app.dataSources.mysqlDs.automigrate('CoffeeShop', function(err) {
    if (err) throw err;

    app.models.CoffeeShop.create([{
      name: 'Bel Cafe',
      city: 'Vancouver'
    }, {
      name: 'Three Bees Coffee House',
      city: 'San Mateo'
    }, {
      name: 'Caffe Artigiano',
      city: 'Vancouver'
    }, ], function(err, coffeeShops) {
      if (err) throw err;

      console.log('Models created: \n', coffeeShops);
    });
  });
};

這將保存一些測試數(shù)據(jù)到數(shù)據(jù)源馒闷。

五酪捡、擴(kuò)展API

添加遠(yuǎn)程方法

按著如下步驟:

  1. 查看您的應(yīng)用程序的/common/models目錄。你會(huì)注意到文件夾里有coffee-shop.js和coffee-shop.json這兩個(gè)文件纳账。
  2. 在編輯器中打開coffee-shop.js逛薇,默認(rèn)情況下,它包含一個(gè)空的函數(shù):
module.exports = function(CoffeeShop) {};
  1. 將以下代碼添加到此函數(shù)中:
module.exports = function(CoffeeShop) {
  CoffeeShop.status = function(cb) {
    var currentDate = new Date();
    var currentHour = currentDate.getHours();
    var OPEN_HOUR = 6;
    var CLOSE_HOUR = 20;
    console.log('Current hour is %d', currentHour);
    var response;
    if (currentHour > OPEN_HOUR && currentHour < CLOSE_HOUR) {
      response = 'We are open for business.';
    } else {
      response = 'Sorry, we are closed. Open daily from 6am to 8pm.';
    }
    cb(null, response);
  };
  CoffeeShop.remoteMethod(
    'status', {
      http: {
        path: '/status',
        verb: 'get'
      },
      returns: {
        arg: 'status',
        type: 'string'
      }
    }
  );
};

這定義了一個(gè)稱為“狀態(tài)”的簡單遠(yuǎn)程方法疏虫,它不需要任何參數(shù)永罚,并且根據(jù)當(dāng)前時(shí)間檢查時(shí)間并返回一個(gè)表示“打開營業(yè)”或“對(duì)不起我們關(guān)閉”的JSON狀態(tài)消息啤呼。

當(dāng)然,在實(shí)踐中呢袱,您可以使用遠(yuǎn)程方法來做更多有趣和復(fù)雜的事情官扣,例如在將數(shù)據(jù)保留到數(shù)據(jù)庫之前操縱輸入數(shù)據(jù)。您還可以更改調(diào)用遠(yuǎn)程方法的路由产捞,并定義復(fù)雜參數(shù)并返回值醇锚。

使用遠(yuǎn)程方法

  1. 回到應(yīng)用程序根目錄,運(yùn)行應(yīng)用程序:
$ node .
  1. 轉(zhuǎn)到http:// localhost:3000 / explorer查看API資源管理器坯临。然后點(diǎn)擊CoffeeShops焊唬,你會(huì)看到有一個(gè)新的REST端點(diǎn),GET / CoffeeShop / status調(diào)用遠(yuǎn)程方法看靠。

點(diǎn)擊try it out赶促!您會(huì)看到調(diào)用遠(yuǎn)程方法的結(jié)果:

{
  "status": "Open for business."
}

通過LoopBack,很輕易地添加了一個(gè)遠(yuǎn)程方法。

在遠(yuǎn)程方法中執(zhí)行創(chuàng)建,檢索吠裆,更新和刪除方法

狀態(tài)遠(yuǎn)程方法是微不足道的比被,但遠(yuǎn)程方法還可以訪問任何標(biāo)準(zhǔn)模型創(chuàng)建,檢索菜皂,更新和刪除方法來執(zhí)行數(shù)據(jù)處理和驗(yàn)證。這是一個(gè)簡單的例子(這不是在loopback-getting-started庫中):

module.exports = function(CoffeeShop) {
...
  CoffeeShop.getName = function(shopId, cb) {
    CoffeeShop.findById( shopId, function (err, instance) {
        var response = "Name of coffee shop is " + instance.name;
        cb(null, response);
        console.log(response);
    });
  }
...
  CoffeeShop.remoteMethod (
        'getName',
        {
          http: {path: '/getname', verb: 'get'},
          accepts: {arg: 'id', type: 'number', http: { source: 'query' } },
          returns: {arg: 'name', type: 'string'}
        }
    );
}

然后如果您訪問遠(yuǎn)程方法,例如:

http://0.0.0.0:3000/api/CoffeeShops/getname?id=1

將會(huì)得到響應(yīng):

{
  "name": "Name of coffee shop is Bel Cafe"
}

六凸主、添加一個(gè)靜態(tài)頁面

中間件簡介

在繼續(xù)之前,您首先需要了解Express中間件的基礎(chǔ)知識(shí)额湘。中間件只是一個(gè)JavaScript函數(shù)卿吐,可以訪問表示HTTP請(qǐng)求的請(qǐng)求對(duì)象(req),表示HTTP響應(yīng)的響應(yīng)對(duì)象(res)锋华,以及Express應(yīng)用程序的請(qǐng)求 - 響應(yīng)周期中嗡官,由一個(gè)名為next的變量表示的下一個(gè)中間件。

中間件可以做什么毯焕?

  • 執(zhí)行任何代碼衍腥。
  • 更改請(qǐng)求和響應(yīng)對(duì)象。
  • 結(jié)束請(qǐng)求 - 響應(yīng)周期纳猫。
  • 調(diào)用堆棧中的下一個(gè)中間件紧阔。

LoopBack中間件就像Express中間件,除了LoopBack添加了相位的概念续担,使您能夠輕松設(shè)置調(diào)用中間件的順序擅耽。這避免了Express的一個(gè)棘手問題:確保中間件在需要的時(shí)候能夠執(zhí)行。

當(dāng)您使用應(yīng)用程序生成器創(chuàng)建應(yīng)用程序時(shí)物遇,它將創(chuàng)建一個(gè)server/middleware.json文件乖仇,指定中間件在哪個(gè)階段執(zhí)行憾儒。注冊新的中間件與編輯此JSON文件一樣簡單:

server/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.json中的每個(gè)頂層鍵都定義了一個(gè)中間件階段:initialsession乃沙,auth等等起趾,到final為止。在給定階段之前和之后警儒,還有修改器注冊中間件训裆。在給定階段的前后也有注冊中間件的修改器。

更換或修改默認(rèn)的根路由處理程序

應(yīng)用程序通常需要提供靜態(tài)內(nèi)容蜀铲,如HTML和CSS文件边琉,客戶端JavaScript文件,圖像等记劝。
使用LoopBack應(yīng)用程序默認(rèn)的腳手架很容易做到变姨。您將去配置應(yīng)用程序去啟動(dòng)/client文件夾中的靜態(tài)資源。

首先厌丑,您必須禁用根URL的默認(rèn)路由處理程序定欧。當(dāng)你加載應(yīng)用程序的根URL [http:// localhost:3000/](http:// localhost:3000/)時(shí),你看到應(yīng)用程序用一個(gè)簡單的狀態(tài)消息怒竿,如這個(gè):

{"started":"2014-11-20T21:59:47.155Z","uptime":42.054}

這是因?yàn)槟J(rèn)情況下砍鸠,腳手架應(yīng)用程序具有一個(gè)名為root.js的啟動(dòng)腳本,該腳本為根路徑(“/”)設(shè)置路由處理中間件:

server/boot/root.js

module.exports = function(server) { // Install a `/` route that returns server status
  var router = server.loopback.Router();
  router.get('/', server.loopback.status());
  server.use(router);
};

該代碼說耕驰,對(duì)于根URI(“/”)的任何GET請(qǐng)求爷辱,應(yīng)用程序?qū)⒎祷豯oopback.status()的結(jié)果。要加入您自己的靜態(tài)頁面耍属,您需要禁用此腳本托嚣。要么刪除它巩检,要么將其重命名為沒有.js結(jié)尾的東西(確保應(yīng)用程序不會(huì)執(zhí)行它)厚骗。

定義靜態(tài)中間件

接下來,您需要定義靜態(tài)中間件來為/ client目錄中的文件提供服務(wù)兢哭。

server/middleware.json

...
"files": {},
...

添加以下內(nèi)容:

server/middleware.json

...
"files": {
  "loopback#static": {
    "params": "$!../client" 
  }
},
...

添加一個(gè)HTML文件

這些行定義靜態(tài)中間件领舰,使應(yīng)用程序?qū)? client目錄中的文件作為靜態(tài)內(nèi)容。$迟螺!字符表示路徑是相對(duì)于middleware.json文件的位置冲秽。

/client/index.html

<head><title>LoopBack</title></head>
<body>
    <h1>LoopBack Rocks!</h1>
    <p>Hello World... </p>
</body>

運(yùn)行

現(xiàn)在再次運(yùn)行應(yīng)用程序:

node .

打開http://0.0.0.0:3000/

七、添加自定義的Express路由

引入引導(dǎo)腳本

當(dāng)LoopBack應(yīng)用程序啟動(dòng)(也稱為引導(dǎo)(bootstraps))時(shí)矩父,它將運(yùn)行/server/boot目錄中的腳本锉桑,稱為引導(dǎo)腳本。默認(rèn)情況下窍株,LoopBack按字母順序加載引導(dǎo)腳本民轴。

應(yīng)用程序生成器創(chuàng)建的標(biāo)準(zhǔn)LoopBack應(yīng)用腳手架中包含執(zhí)行基本初始化的以下標(biāo)準(zhǔn)引導(dǎo)腳本(在/ server / boot中):

  • authentication.js - 通過調(diào)用app.enableAuth()來啟用應(yīng)用程序的身份驗(yàn)證攻柠。
  • root.js - 使用loopback.status()中間件定義/返回服務(wù)器狀態(tài)的根路由。

添加一個(gè)新的啟動(dòng)腳本

例如后裸,在/server/boot目錄中添加一個(gè)名為routes.js的新引導(dǎo)腳本瑰钮,其代碼如下:

/server/boot/routes.js

module.exports = function(app) {
  // Install a "/ping" route that returns "pong"
  app.get('/ping', function(req, res) {
    res.send('pong');
  });
}

除此之外,也可以使用Express路由器中間件微驶,如下所示:

/server/boot/routes.js

module.exports = function(app) {
  var router = app.loopback.Router();
  router.get('/ping', function(req, res) {
    res.send('pongaroo');
  });
  app.use(router);
}

實(shí)際上浪谴,您也可以使用Express API在server.js中添加路由。例如因苹,在調(diào)用app.start()之前將此調(diào)用添加到app.use():

server/server.js

...
app.use('/express-status', function(req, res, next) {
  res.json({ running: true });
});

// start the server if `$ node server.js`
if (require.main === module) {
  app.start();
}

LoopBack應(yīng)用程序可以輕松地執(zhí)行Express應(yīng)用程序可以執(zhí)行的所有操作苟耻。如果您熟悉Express,LoopBack將會(huì)更容易學(xué)習(xí)容燕。

運(yùn)行引導(dǎo)腳本

現(xiàn)在梁呈,再次運(yùn)行應(yīng)用程序:

加載http://0.0.0.0:3000/ping。您會(huì)得到一個(gè)'pong'的響應(yīng)蘸秘。

現(xiàn)在一個(gè)簡單的loopback應(yīng)用程序就已經(jīng)搭建完成了官卡。

八、下一步

接下來的教程將涵蓋:

  • 在單個(gè)應(yīng)用程序中使用多個(gè)數(shù)據(jù)源醋虏。
  • 模型之間的關(guān)系寻咒。
  • 遠(yuǎn)程鉤子。
  • 使用權(quán)限控制來保護(hù)REST接口颈嚼。
  • 用戶注冊和認(rèn)證
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末毛秘,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子阻课,更是在濱河造成了極大的恐慌叫挟,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,123評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件限煞,死亡現(xiàn)場離奇詭異抹恳,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)署驻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門奋献,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人旺上,你說我怎么就攤上這事瓶蚂。” “怎么了宣吱?”我有些...
    開封第一講書人閱讀 156,723評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵窃这,是天一觀的道長。 經(jīng)常有香客問我征候,道長杭攻,這世上最難降的妖魔是什么洒试? 我笑而不...
    開封第一講書人閱讀 56,357評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮朴上,結(jié)果婚禮上垒棋,老公的妹妹穿的比我還像新娘。我一直安慰自己痪宰,他們只是感情好叼架,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評(píng)論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著衣撬,像睡著了一般乖订。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上具练,一...
    開封第一講書人閱讀 49,760評(píng)論 1 289
  • 那天乍构,我揣著相機(jī)與錄音,去河邊找鬼扛点。 笑死哥遮,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的陵究。 我是一名探鬼主播眠饮,決...
    沈念sama閱讀 38,904評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼铜邮!你這毒婦竟也來了仪召?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,672評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤松蒜,失蹤者是張志新(化名)和其女友劉穎扔茅,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體秸苗,經(jīng)...
    沈念sama閱讀 44,118評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡召娜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了难述。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片萤晴。...
    茶點(diǎn)故事閱讀 38,599評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡吐句,死狀恐怖胁后,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情嗦枢,我是刑警寧澤攀芯,帶...
    沈念sama閱讀 34,264評(píng)論 4 328
  • 正文 年R本政府宣布,位于F島的核電站文虏,受9級(jí)特大地震影響侣诺,放射性物質(zhì)發(fā)生泄漏殖演。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評(píng)論 3 312
  • 文/蒙蒙 一年鸳、第九天 我趴在偏房一處隱蔽的房頂上張望趴久。 院中可真熱鬧,春花似錦搔确、人聲如沸彼棍。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽座硕。三九已至,卻和暖如春涕蜂,著一層夾襖步出監(jiān)牢的瞬間华匾,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評(píng)論 1 264
  • 我被黑心中介騙來泰國打工机隙, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蜘拉,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,286評(píng)論 2 360
  • 正文 我出身青樓有鹿,卻偏偏與公主長得像诸尽,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子印颤,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容