Java開發(fā)者結(jié)合Node.js編程入門教程
首先, 我必須得承認(rèn),作為一個(gè)有著十多年開發(fā)經(jīng)驗(yàn)的java開發(fā)者,我已經(jīng)形成了解決絕大部分問題的固有套路,盡管它們很多時(shí)候顯得笨重和繁瑣。 比如說如果要讀取一個(gè)文件,那應(yīng)該就是初始化一個(gè)BufferedReader 實(shí)例并傳入一個(gè)FileReader,這幾乎是順理成章的,我在很多自認(rèn)為算得上“企業(yè)級(jí)”的項(xiàng)目中編寫這樣的代碼并且很享受這個(gè)過程,可以說我就是一個(gè)對(duì)其他語言不屑一顧的java腦殘粉。
如果你正在閱讀這篇博文,你可能已經(jīng)陷入了我多年前早就陷入的一個(gè)誤區(qū),作為一名合格的開發(fā)人員應(yīng)該不斷地學(xué)習(xí)新的技術(shù)并且根據(jù)實(shí)際工作需求選用適 當(dāng)?shù)募夹g(shù)。盡管我一直在變老并且有朝一日可能會(huì)厭煩了java。但是我現(xiàn)在真的發(fā)現(xiàn)了一個(gè)激動(dòng)人心的新東西,node.js對(duì)于我就像一個(gè)兒童得到一個(gè)新 奇的玩具,在這篇博文中,我將先向您展示如何使用Java EE創(chuàng)建一個(gè)簡單的Rest服務(wù)來讀取 MongoDB數(shù)據(jù)庫。然后我會(huì)用node.js來實(shí)現(xiàn)相同的功能,你會(huì)更容易了解到這種新的開發(fā)語言的激動(dòng)人心之處。
從基礎(chǔ)開始——什么是Node.js?
首先,我要說明一點(diǎn),Node.js不是那種“新潮時(shí)尚”,只有“潮人”才使用的語言。雖然它是本著這種認(rèn)知開始,但是我很高興的報(bào)告給大 家,Node.js是一種成熟的語言——并且在當(dāng)下這個(gè)互聯(lián)網(wǎng)時(shí)代,它已經(jīng)找到了其自己的方式進(jìn)入大型企業(yè),支撐起一些最高流量的網(wǎng)站。Node.js是 你技能儲(chǔ)備當(dāng)中的一個(gè)非常實(shí)用的工具,在構(gòu)建穩(wěn)定、安全和高性能的代碼上,其便捷度會(huì)令你大吃一驚。
言而總之,Node是一種針對(duì)服務(wù)器端活動(dòng)的語言。它使用了Javascript語言,并且有非常多的庫可用,比如npm模型。你可以把那些npm 模型比作Java中的.jar包。當(dāng)你需要一部分功能,并且不喜歡自己全部編寫這部分代碼,極有可能在npm模型中已經(jīng)提供了你正在尋找的特性。
Node應(yīng)用程序通常執(zhí)行時(shí)需要實(shí)現(xiàn)效率最大化利用非阻塞 I/O 和異步事件。對(duì)于Java開發(fā)者來講需要知道的一點(diǎn)是Node應(yīng)用運(yùn)行單線程中。然而,后端節(jié)點(diǎn)代碼使用多個(gè)線程進(jìn)行操作,如網(wǎng)絡(luò)和文件訪問。鑒于此,Node對(duì)于那些需要實(shí)時(shí)經(jīng)驗(yàn)的應(yīng)用是完美的選擇。
繼續(xù)——IDE支持
你可能會(huì)像我一樣,在IDE中“生存”和“呼吸”,這可能源于Java實(shí)在是太羅嗦了,需要我們?cè)谲浖_發(fā)過程中編寫恒定的代碼來完成功能。一旦我們找到 了代碼完成的好處,我們慢慢學(xué)會(huì)了使用 IDE 進(jìn)行文件管理、 調(diào)試和其他非常有用的功能??梢赃@樣說,我喜歡使用一款I(lǐng)DE并且在使用Nodeb工作時(shí)繼續(xù)使用它。下面是當(dāng)前最為第一批支持Node的IDE:
1.Eclipse——這應(yīng)該很容易上手當(dāng)你在Java中已經(jīng)使用它。僅需要安裝Node.js插件即可。
2.JetBrains IntelliJ IDEA——一款非常流行的商業(yè)化的IDE。目前為止,這是我最喜歡的IDE。
3.Microsoft Visual Studio——是的,你沒看錯(cuò)。Node已經(jīng)成長到微軟在Visual Studio添加了對(duì)其的原生支持。這個(gè)實(shí)現(xiàn)非常穩(wěn)定,并且VS是我第二喜歡的IDE。說來也怪,我使用VS僅僅用作一些基礎(chǔ)的Node項(xiàng)目。
4.CodeEnvy——一款基于web的IDE
5.Cloud9——一款基于web的IDE
6.SublimeText 2——沒有多余裝飾的文本編輯器,由于其輕量級(jí),在開發(fā)者中的知名度越來越高。
這是我工作在Node基礎(chǔ)項(xiàng)目上的最喜歡的幾款I(lǐng)DE。僅僅做個(gè)舉例。
從一個(gè)范例開始
在這篇博文的剩下部分里,我們將要用Java EE和Node.js結(jié)合起來創(chuàng)建一個(gè)簡單的REST服務(wù)。這個(gè)REST服務(wù)將會(huì)簡單的從MongoDB數(shù)據(jù)庫里面讀取信息并且返回這些結(jié)果給請(qǐng)求者。而 關(guān)于Java應(yīng)用服務(wù)器和MongoDB數(shù)據(jù)庫的安裝和配置則不在本文的討論范圍之中。
創(chuàng)建我們的Java應(yīng)用
第一步:配置pom.xml文件
我們把這個(gè)范例叫做restexample ,我將會(huì)使用JBoss EAP應(yīng)用服務(wù)器。第一件我們要做的事情就是為使用Maven構(gòu)建系統(tǒng)的依賴管理來配置我們的pom.xml文件。下面就是包含了我們這個(gè)restexample 應(yīng)用里面所需要的依賴的pom.xml文件:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>restexample</groupId> <artifactId>restexample</artifactId> <packaging>war</packaging> <version>1.0</version> <name>restexample</name> <repositories> <repository> <id>eap</id> <url>http://maven.repository.redhat.com/techpreview/all</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>true</enabled> </snapshots> </repository> </repositories> <pluginRepositories> <pluginRepository> <id>eap</id> <url>http://maven.repository.redhat.com/techpreview/all</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>true</enabled> </snapshots> </pluginRepository> </pluginRepositories> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.6</maven.compiler.source> <maven.compiler.target>1.6</maven.compiler.target> </properties> <dependencies> <dependency> <groupId>org.jboss.spec</groupId> <artifactId>jboss-javaee-6.0</artifactId> <version>3.0.2.Final-redhat-4</version> <type>pom</type> <scope>provided</scope> </dependency> <dependency> <groupId>org.mongodb</groupId> <artifactId>mongo-java-driver</artifactId> <version>2.9.1</version> </dependency> </dependencies> </project>
酷,相當(dāng)?shù)脑敿?xì),但是我希望你們能夠理解里面的代碼,在這篇博文中我假設(shè)讀者都已經(jīng)了解Java,因此我不準(zhǔn)備解釋里面的細(xì)節(jié)了。
第二步:創(chuàng)建beans.xml文件并且設(shè)置我們的servlet映射
作為范例的一部分,我們將會(huì)對(duì)我們的數(shù)據(jù)庫訪問類使用CDI(上下文依賴注入)。根據(jù)官方的CDI配置說明,一個(gè)應(yīng)用要使用CDI的話就要在該應(yīng)用的 WEB-INF 目錄里面包含一個(gè)beans.xml文件。因此我們就來創(chuàng)建這個(gè)文件并且按照我們所需的信息來配置它。進(jìn)入到你的 /src/main/webapp/WEB-INF 目錄然后創(chuàng)建一個(gè) beans.xml文件,加入下面的代碼:
<?xml version="1.0"?> <beans xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://jboss.org/schema/cdi/beans_1_0.xsd"/>
我們也需要在 web.xml 文件里面為我們的RESI API設(shè)置servlet映射。在 /src/main/webapp/WEB-INF 目錄的文件里面加入下面的servlet映射元素:
<servlet-mapping> <servlet-name>javax.ws.rs.core.Application</servlet-name> <url-pattern>/ws/*</url-pattern> </servlet-mapping>
第三步:創(chuàng)建DBConnection類
到這一步,我們已經(jīng)建立好項(xiàng)目并且我們的pom.xml文件已經(jīng)包含了MongoDB數(shù)據(jù)庫的驅(qū)動(dòng)依賴,記得要確保所需要的驅(qū)動(dòng)已經(jīng)被打包好在我們的應(yīng)用里面。下一件事我們就要?jiǎng)?chuàng)建一個(gè)類用來管理數(shù)據(jù)庫的連接。創(chuàng)建一個(gè)新的文件命名為 DBConneection.java,把這個(gè)文件放置到 /src/main/java/com/strongloop/data 目錄里面,然后再這個(gè)文件里面加入下面的代碼:
注意:要確保你安裝MongoDB數(shù)據(jù)庫配置好適當(dāng)?shù)倪B接授權(quán)細(xì)節(jié)信息!
package com.strongloop.data; import java.net.UnknownHostException; import javax.annotation.PostConstruct; import javax.enterprise.context.ApplicationScoped; import javax.inject.Named; import com.mongodb.DB; import com.mongodb.Mongo; @Named @ApplicationScoped public class DBConnection { private DB mongoDB; public DBConnection() { super(); } @PostConstruct public void afterCreate() { String mongoHost = "127.0.0.1" String mongoPort = "27001" String mongoUser = "strongloop; String mongoPassword = "rocks"; String mongoDBName = "restexample"; int port = Integer.decode(mongoPort); Mongo mongo = null; try { mongo = new Mongo(mongoHost, port); } catch (UnknownHostException e) { System.out.println("Couldn't connect to MongoDB: " + e.getMessage() + " :: " + e.getClass()); } mongoDB = mongo.getDB(mongoDBName); if (mongoDB.authenticate(mongoUser, mongoPassword.toCharArray()) == false) { System.out.println("Failed to authenticate DB "); } } public DB getDB() { return mongoDB; } }
第四步:把數(shù)據(jù)導(dǎo)入到MongoDB中(mmmm啤酒)
在我們的項(xiàng)目中,我們想要加載所有名稱為Pabst的啤酒列表。如果你不熟悉啤酒行業(yè),你可以試下Pabst Brewing公司生產(chǎn)的美式淡啤。這些啤酒上面帶有藍(lán)綬帶和柯爾特{敏感詞}圖案,他們包含所有的麥芽糖飲料種類。
首先你需要下載一個(gè)json文件,里面包含需要返回的所有數(shù)據(jù)。你可以用下面的URL來實(shí)現(xiàn)這點(diǎn):
https://dl.dropboxusercontent.com/u/72466829/beers.json
下載結(jié)束后,使用mongoimport命令把它導(dǎo)入到數(shù)據(jù)庫中,命令如下:
$ mongoimport --jsonArray -d yourDBName -c beers --type json --file /tmp/beers.json -h yourMongoHost --port yourMongoPort -u yourMongoUsername -p yourMongoPassword
你可以看到如下結(jié)果:
connected to: 127.0.0.1:27017 Tue Jun 10 20:09:55.436 check 9 24 Tue Jun 10 20:09:55.437 imported 24 objects
第5步: 創(chuàng)建Beer模型對(duì)象
我們已經(jīng)創(chuàng)建了一個(gè)數(shù)據(jù)庫連接類并且已經(jīng)把啤酒信息載入到MongoDB數(shù)據(jù)庫里了,是時(shí)候創(chuàng)建一個(gè)模型對(duì)象來控制我們的啤酒信息了。創(chuàng)建一個(gè)新文件,名為Beer.java并把它放到/src/main/java/com/strongloop/data目錄下。創(chuàng)建好該文件后,在其中添加如下代碼:
package com.strongloop.data; public class Beer { private String id; private String name; private String description; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } }
注意: 提供好的JSON文件中包含了更多我們將會(huì)使用到的信息,所以可以找出來看看,并向其中添加一些額外的功能來拓寬你的學(xué)習(xí)經(jīng)驗(yàn)。
第6步: 創(chuàng)建REST服務(wù)
猜猜看該干什么了?不錯(cuò),我們終于準(zhǔn)備好要?jiǎng)?chuàng)建基于REST的web服務(wù)了,它使我們可以獲取到上一個(gè)步驟當(dāng)中載入進(jìn)來的啤酒信息。為此,我們需要?jiǎng)?chuàng)建一個(gè)新的名為BeerWS.java的文件,并把它放到/src/main/java/com/strongloop/webservice目錄下。創(chuàng)建好之后,添加下列代碼:
package com.strongloop.webservice; import java.util.ArrayList; import java.util.List; import javax.enterprise.context.RequestScoped; import javax.inject.Inject; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.QueryParam; import com.strongloop.data.DBConnection; import com.strongloop.data.Beer; import com.mongodb.BasicDBObject; import com.mongodb.DB; import com.mongodb.DBCollection; import com.mongodb.DBCursor; import com.mongodb.DBObject; @RequestScoped @Path("/beers") public class BeerWS { @Inject private DBConnection dbConnection; private DBCollection getBeerCollection() { DB db = dbConnection.getDB(); DBCollection beerCollection = db.getCollection("beers"); return beerCollection; } private Beer populateBeerInformation(DBObject dataValue) { Beer theBeer = new Beer(); theBeer.setName(dataValue.get("name")); theBeer.setDescription(dataValue.get("name")); theBeer.setId(dataValue.get("_id").toString()); return theBeer; } // 獲取所有啤酒 @GET() @Produces("application/json") public List<Beer> getAllBeers() { ArrayList<Beer> allBeersList = new ArrayList<Beer>(); DBCollection beers = this.getBeerCollection(); DBCursor cursor = beers.find(); try { while (cursor.hasNext()) { allBeersList.add(this.populateBeerInformation(cursor.next())); } } finally { cursor.close(); } return allBeersList; } }
第7步: 瀏覽著啤酒信息傻樂
喔,搞定。我們已經(jīng)寫好了一個(gè)REST服務(wù),可以從數(shù)據(jù)庫中獲取所有的啤酒信息。現(xiàn)在把你的代碼部署到你的應(yīng)用服務(wù)器吧, 在瀏覽器中打開下列地址看看它是否工作正常:
http://yourserverlocation/ws/beers
如果所有東西都正常,你將會(huì)看到所有的啤酒信息列表,如下圖所示:
創(chuàng)建 Node 應(yīng)用
如果你按照上面的步驟使用java進(jìn)行編程,你會(huì)意識(shí)到使用javaEE創(chuàng)建應(yīng)用盡管進(jìn)展很快,但是創(chuàng)建一個(gè)類似REST服務(wù)的簡單應(yīng)用還是很麻煩。不要誤解,我仍然很喜歡用javaEE,但是發(fā)現(xiàn)對(duì)于很多場(chǎng)景,比如創(chuàng)建返回json數(shù)據(jù)的REST服務(wù),Node更適用。接下來,我們將要使用StrongLoop的LoopBack API創(chuàng)建一個(gè)簡單的web服務(wù)。另外,我會(huì)向你展示如何在蘋果OSX系統(tǒng)上安裝Node。
步驟1:安裝 Node
最簡單的安裝Node的方式是通過一個(gè)兼容大部分操作系統(tǒng)的二進(jìn)制包。打開瀏覽器訪問下面的網(wǎng)頁,根據(jù)你的操作系統(tǒng)下載適用的版本:
http://nodejs.org/download/
下載完成后,你會(huì)看到下面的內(nèi)容:
如果你用的是Mac OSX,點(diǎn)擊通用的.pkg文件。這會(huì)把安裝程序保存到你本機(jī)中。下載了該文件之后,雙擊它就可以啟動(dòng)安裝程序,你會(huì)看到下列安裝對(duì)話框:
一路默認(rèn)的安裝下去,成功安裝之后,點(diǎn)擊close按鈕來退出安裝程序。
相當(dāng)簡單,是吧?
步驟2:使用NPM安裝LoopBack
現(xiàn)在本地系統(tǒng)中已經(jīng)安裝了Node,接下來要安裝StroopLoop公司提供的LoopBack包。LoopBack是一個(gè)開放的API源碼包,當(dāng)你學(xué)習(xí)使用Node開發(fā)、部署軟件時(shí),LoopBack可以使編程更簡單。
為了安裝LoopBack,我們要使用npm命令行,它是Node語言核心的一部分。NPM是一個(gè)官方的包管理工具,用于安裝應(yīng)用程序依賴的類庫或模版。如果你是一名java程序員,你可以把NPM比作Maven。使用Maven構(gòu)建項(xiàng)目,開發(fā)人員可以在pom.xml中配置項(xiàng)目依賴的jar包或模版。當(dāng)項(xiàng)目開始編譯時(shí),Maven會(huì)下載所有依賴的文件,并將jar包引入到項(xiàng)目中。NPM工作原理和Maven相同,對(duì)于一些特殊的項(xiàng)目,它使用package.json文件來配置項(xiàng)目依賴的文件。你也可以使用命令行方式將依賴的文件下載到本地系統(tǒng)中。如果這些內(nèi)容你不理解,不要擔(dān)心,在接下來的步驟里我們會(huì)詳細(xì)描述package.json文件。
為了安裝LoopBack, 我們使用一個(gè)簡單的命令行來下載和安裝所有依賴的文件。打開你的window命令行窗口,輸入下面命令:
$ npm install -g strongloop
提示:安裝時(shí),你可能需要使用其它用戶帳號(hào)來執(zhí)行這個(gè)命令。
這個(gè)命令行是什么含義呢?-g參數(shù)表示告訴npm我們想要安裝strong-cli包。-g參數(shù)使這個(gè)包對(duì)任何系統(tǒng)和應(yīng)用程序都兼容。一旦你運(yùn)行了上面的命令,NPM會(huì)下載所有依賴的文件。下載的時(shí)間視網(wǎng)速而定,可能需要幾分鐘。
步驟3:創(chuàng)建應(yīng)用程序
使用LoopBack API創(chuàng)建一個(gè)應(yīng)用程序很簡單。 打開你的window命令行窗口,使用下面的命令來創(chuàng)建一個(gè)新的應(yīng)用程序restexample.
$ slc loopback
接下來它會(huì)提示輸入項(xiàng)目根路徑的名稱。 在這個(gè)示例中,使用restexample。 接下來它會(huì)提示輸入應(yīng)用程序名稱。 使用默認(rèn)值restexample。
slc命令現(xiàn)在已經(jīng)創(chuàng)建一個(gè)名稱為restexample的LoopBack應(yīng)用程序,并且已經(jīng)配置了這個(gè)應(yīng)用程序。 如果再次執(zhí)行上面的命令,仍然使用restexample命名,LoopBack會(huì)創(chuàng)建一個(gè)新的目錄。 可以使用cd命令來修改應(yīng)用程序的根路徑。
$ cd restexample
現(xiàn)在我們已經(jīng)創(chuàng)建完一個(gè)應(yīng)用程序,接下來我們將MongoDB配置為程序的數(shù)據(jù)源。
步驟4:定義數(shù)據(jù)源
為了連通MongoDB,我們需要給應(yīng)用程序增加一個(gè)數(shù)據(jù)源,運(yùn)行以下命令即可:
$ slc loopback:datasource
在彈出的提示符下,可以輸入任意自定義的數(shù)據(jù)源名稱,這里選擇myMongo
[?] Enter the data-source name: myMongo
這樣我們就將后端的數(shù)據(jù)源定義附加到由StrongLoop支持的真實(shí)連接器上面.這里我們從列表選擇MongoDB連接器.
[?] Select the connector for myMongo: PostgreSQL (supported by StrongLoop) Oracle (supported by StrongLoop) Microsoft SQL (supported by StrongLoop) MongoDB (supported by StrongLoop) SOAP webservices (supported by StrongLoop) REST services (supported by StrongLoop) Neo4j (provided by community) (Move up and down to reveal more choices)
步驟5:指向真實(shí)的數(shù)據(jù)源
為了連通MongoDB,我們需要指向真實(shí)際的MongoDB實(shí)例.LoopBack在datasource.json文件中定義了所有的數(shù)據(jù)源配置信息.這個(gè)文件位于應(yīng)用程序的root/server目錄.打開這個(gè)文件,按照如下的方式,為MongoDB增加一個(gè)數(shù)據(jù)源:
{ "db": { "name": "db", "connector": "memory" }, "myMongo": { "name": "myMongo", "connector": "mongodb" "url": "mongodb://localhost:27017/restexample" } }
注意:要保證為MongoDB數(shù)據(jù)庫提供正確的 連接 URL.針對(duì)這個(gè)例子,我創(chuàng)建了一個(gè)名為 restexample 的數(shù)據(jù)庫,它用來作為數(shù)據(jù)源.
步驟6:導(dǎo)入數(shù)據(jù)到MongoDB(mmmmm 啤酒)
就像本文Java部分說到的那樣,我們需要加載數(shù)據(jù)集到MongoDB數(shù)據(jù)庫中.如果你已經(jīng)按照本文說到的方法完成了這個(gè)步驟,然后打算使用同一個(gè)數(shù)據(jù)庫,你可以忽略步驟6,直接跳到步驟7.
首先,你需要下載一個(gè)包含所有要返回信息的JSON文件,可以從如下的URL獲取:
https://dl.dropboxusercontent.com/u/72466829/beers.json
數(shù)據(jù)集文件下載完畢后,直接使用如下的mongoimport命令將它加載到數(shù)據(jù)庫:
$ mongoimport --jsonArray -d yourDBName -c beers --type json --file /tmp/beers.json -h yourMongoHost --port
你應(yīng)該可以看到如下的結(jié)果:
connected to: 127.6.189.2:27017 Tue Jun 10 20:09:55.436 check 9 24 Tue Jun 10 20:09:55.437 imported 24 objects
步驟7:創(chuàng)造我們自己的啤酒模型
在Java世界里,由此可以想到對(duì)象模型.它代表這一個(gè)對(duì)象,只是在這里,這個(gè)對(duì)象是啤酒.LoopBack通過命令行,提供了一種創(chuàng)建模型對(duì)象的簡便方式.打開終端窗口,進(jìn)入到工程文件夾,輸入如下命令:
$ slc loopback:model
這將會(huì)開啟一個(gè)交互式的會(huì)話來定義模型.首先需要輸入的是模型名稱,這里輸入"beer".接下來會(huì)提示,這個(gè)模型應(yīng)該附加到的數(shù)據(jù)源,這里選擇之前創(chuàng)建的myMongo數(shù)據(jù)源.
[?] Enter the model name: beer [?] Select the data-source to attach beer to: db (memory) myMongo (mongodb)
接下來提示,是否通過REST將此API暴露出來.當(dāng)然,這里希望這樣.
[?] Expose beer via the REST API? Yes
最后,為模型選擇網(wǎng)絡(luò)復(fù)數(shù)名,這里模型名為beer,所以復(fù)數(shù)為beers(默認(rèn)).敲擊Enter鍵接受默認(rèn)值.
[?] Custom plural form (used to build REST URL):
接下來會(huì)提示定義模型屬性.對(duì)這個(gè)示例程序,我們關(guān)注名稱和對(duì)啤酒的描述.
Enter an empty property name when done. [?] Property name: name
只要敲擊了Enter,就會(huì)提示輸入各個(gè)指定屬性的數(shù)據(jù)類型.第一個(gè)項(xiàng)是name,這里選擇字符串類型.選擇字符串類型,然后敲擊
Enter. [?] Property type: (Use arrow keys) string number boolean object array date buffer geopoint (other)
接下來,按照同樣的方式創(chuàng)建description屬性,接著會(huì)要求輸入數(shù)據(jù)類型.它同樣是一個(gè)字符串類型,選擇字符串選項(xiàng),然后敲擊
Enter. Let's add another beer property. Enter an empty property name when done. [?] Property name: description invoke loopback:property [?] Property type: string [?] Required? Yes
祝賀!你已經(jīng)使用LoopBack結(jié)合Node完成了模型對(duì)象的創(chuàng)建.如果想查看在這個(gè)過程中真正創(chuàng)建了什么,可以打開位于應(yīng)用程序root/common/models目錄的beer.json文件,滾動(dòng)到這個(gè)文件的最后,將會(huì)看到如下模型:
{ "name": "beer", "base": "PersistedModel", "properties": { "name": { "type": "string", "required": true }, "description": { "type": "string", "required": true } }, "validations": [], "relations": {}, "acls": [], "methods": [] }
這里可以看到,我們創(chuàng)建了一個(gè)模型,同時(shí),name和description屬性已經(jīng)賦予了這個(gè)模型.
在/server/model-config.js文件中,可以注意到,文件中包含一些額外的字段,包括public和datasource.其中public域指定我們希望通過一個(gè)REST網(wǎng)絡(luò)服務(wù)將此模型暴露給外部.datasource域則指定這個(gè)模型的CRUD操作將會(huì)用到的數(shù)據(jù)源.
"beer": { "dataSource": "myMongo", "public": true }
步驟8:沉浸在看到beers的喜悅中
祝賀!你已經(jīng)創(chuàng)建了第一個(gè)Node.js應(yīng)用程序,其中包含可以獲取beer信息的REST網(wǎng)絡(luò)服務(wù).最后,我們需要做的就是部署這個(gè)應(yīng)用程序.
慶幸的是,部署是已經(jīng)很容易的事情.可以通過在應(yīng)用程序根目錄執(zhí)行如下命令來完成:
$ slc run
只要應(yīng)用程序一運(yùn)行,就可以通過瀏覽器轉(zhuǎn)到如下的URL來確認(rèn)部署是否成功:
相當(dāng)酷,是不是?
LoopBack同時(shí)也包含了一個(gè)允許查看應(yīng)用程序所有可用服務(wù)的頁面,包括Beer模型和我們創(chuàng)建的REST服務(wù),將瀏覽器指向如下的URL即可查看:
頁面加載成功后,你會(huì)看到下面的界面,我們已經(jīng)創(chuàng)建了beers節(jié)點(diǎn)作為博客的一部分,我把/beers端點(diǎn)進(jìn)行高亮顯示了:
你可以點(diǎn)擊/beers來展開可供調(diào)用的API,你可以操作并測(cè)試一下,如下圖所示:
結(jié)論
在這篇博文中,我展示了如何使用java EE 去創(chuàng)建一個(gè)rest服務(wù),這個(gè)服務(wù)能夠返回Pabst啤酒公司的啤酒產(chǎn)品清單數(shù)據(jù)。 之后我又使用node.js以及基于node.js的loopback框架使用很少的代碼實(shí)現(xiàn)了相同功能的rest服務(wù)。 最重要的是,LoopBack API 還對(duì)beer實(shí)體的增刪查改提供了默認(rèn)的實(shí)現(xiàn),使得我們不用再寫一行代碼就得到了一個(gè)具有完整增刪查改功能的rest服務(wù)。
下面的清單對(duì)博文中涉及的javaEE和node.js各自特性進(jìn)行一個(gè)對(duì)比:
Feature |
Java EE |
Node.js |
完善的IDE支持 |
Yes, 多種IDE供選擇,包括 Eclipse, Sublime and Idea |
Yes, 多種IDE供選擇, Visual Studio, Eclipse, Sublime |
依賴管理 |
Maven |
NPM |
有企業(yè)級(jí)項(xiàng)目采用 |
Yes |
Yes |
龐大的組件生態(tài)系統(tǒng) |
Yes |
Yes |
需要 JVM |
Yes |
No |
通用開發(fā)框架 |
Spring, JEE |
Express |
數(shù)據(jù)庫支持 |
Yes |
Yes |
ORM 框架 |
Yes |
Yes |
測(cè)試框架 |
Yes |
Yes |
接下來的內(nèi)容?
即將發(fā)布的Node v0.12 將帶來至少8個(gè)激動(dòng)人心的新特性,它們會(huì)是什么呢?訪問 “What's New in Node.js v0.12” 頁面了解更多.
對(duì)Node相關(guān)的培訓(xùn)和認(rèn)證感興趣? StrongLoop 公司提供各種服務(wù)滿足您的需求。
相關(guān)文章
如何解決 Java 中的 IndexOutOfBoundsException 異
當(dāng)我們?cè)?nbsp;Java 中使用 List 的時(shí)候,有時(shí)候會(huì)出現(xiàn)向 List 中不存在的位置設(shè)置新元素的情況,從而導(dǎo)致 IndexOutOfBoundsException 異常,本文將會(huì)介紹這個(gè)問題的產(chǎn)生原因以及解決方案2023-10-10Spring Boot 開發(fā)環(huán)境熱部署詳細(xì)教程
這篇文章主要介紹了Spring Boot 開發(fā)環(huán)境熱部署,本文給大家介紹了Spring Boot 開發(fā)環(huán)境熱部署的原理及快速配置方法,通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-06-06