在 Azure 中的 Linux VM 上創(chuàng)建 MongoDB凌停、Express、AngularJS 和 Node.js (MEAN) 堆棧

本教程介紹如何在 Azure 中的 Linux VM 上實(shí)現(xiàn) MongoDB李丰、Express、AngularJS 和 Node.js (MEAN) 堆棧逼泣。 通過創(chuàng)建的 MEAN 堆棧趴泌,可以在數(shù)據(jù)庫中添加、刪除和列出書籍拉庶。 你將學(xué)習(xí)如何執(zhí)行以下操作:

創(chuàng)建 Linux VM

安裝 Node.js

安裝 MongoDB 并設(shè)置服務(wù)器

安裝 Express 并設(shè)置服務(wù)器的路由

使用 AngularJS 訪問路由

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

Note

在 Azure 中國區(qū)使用 Azure CLI 2.0 之前嗜憔,請(qǐng)先運(yùn)行az cloud set -n AzureChinaCloud來改變?cè)骗h(huán)境。如果想切回國際版 Azure氏仗,請(qǐng)?jiān)俅芜\(yùn)行az cloud set -n AzureCloud吉捶。

如果選擇在本地安裝并使用 CLI,本教程要求運(yùn)行 Azure CLI 2.0.4 或更高版本皆尔。 運(yùn)行az --version即可查找版本呐舔。 如果需要進(jìn)行安裝或升級(jí),請(qǐng)參閱安裝 Azure CLI 2.0慷蠕。

創(chuàng)建 Linux VM

使用az group create命令創(chuàng)建資源組珊拼,并使用az vm create命令創(chuàng)建 Linux VM。 Azure 資源組是在其中部署和管理 Azure 資源的邏輯容器流炕。

以下示例使用 Azure CLI 在“中國北部”位置創(chuàng)建名為myResourceGroupMEAN的資源組澎现。 將會(huì)創(chuàng)建一個(gè)包含 SSH 密鑰(如果默認(rèn)密鑰位置不存在這些密鑰)的、名為myVM的 VM每辟。 若要使用一組特定的密鑰剑辫,請(qǐng)使用 --ssh-key-value 選項(xiàng)。

Azure CLI復(fù)制

azgroupcreate--namemyResourceGroupMEAN--location"China North"azvmcreate\--resource-groupmyResourceGroupMEAN \--namemyVM \--imageUbuntuLTS \--admin-usernameazureuser \--admin-password'Azure12345678!'\--generate-ssh-keysazvmopen-port--port3300--resource-groupmyResourceGroupMEAN--namemyVM

創(chuàng)建 VM 后渠欺,Azure CLI 顯示類似于以下示例的信息妹蔽。

Azure CLI復(fù)制

{"fqdns":"","id":"/subscriptions/{subscription-id}/resourceGroups/myResourceGroupMEAN/providers/Microsoft.Compute/virtualMachines/myVM","location":"China North","macAddress":"00-0D-3A-23-9A-49","powerState":"VM running","privateIpAddress":"10.0.0.4","publicIpAddress":"13.72.77.9","resourceGroup":"myResourceGroupMEAN"}

記下publicIpAddress。 此地址用于訪問 VM。

使用以下命令來與 VM 建立 SSH 會(huì)話讹开。 請(qǐng)確保使用正確的公共 IP 地址盅视。 在上例中,我們的 IP 地址為 13.72.77.9旦万。

bash復(fù)制

ssh azureuser@13.72.77.9

安裝 Node.js

Node.js是構(gòu)建在 Chrome V8 JavaScript 引擎基礎(chǔ)之上的 JavaScript 運(yùn)行時(shí)闹击。 本教程使用 Node.js 來設(shè)置 Express 路由和 AngularJS 控制器。

在 VM 上成艘,使用通過 SSH 打開的 bash shell 安裝 Node.js赏半。

bash復(fù)制

sudo apt-get install -y nodejs

安裝 MongoDB 并設(shè)置服務(wù)器

MongoDB將數(shù)據(jù)存儲(chǔ)在靈活的、類似于 JSON 的文檔中淆两。 數(shù)據(jù)庫中的字段根據(jù)文檔的不同而異断箫,數(shù)據(jù)結(jié)構(gòu)隨時(shí)可發(fā)生變化。 針對(duì)示例應(yīng)用程序秋冰,我們要將包含書名仲义、ISBN 編號(hào)、作者和頁數(shù)的書籍記錄添加到 MongoDB剑勾。

在 VM 上埃撵,使用通過 SSH 打開的 bash shell 設(shè)置 MongoDB 密鑰。

bash復(fù)制

sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 0C49F3730359A14518585931BC711F9BA15703C6echo"deb [ arch=amd64 ] http://repo.mongodb.org/apt/ubuntu trusty/mongodb-org/3.4 multiverse"| sudo tee /etc/apt/sources.list.d/mongodb-org-3.4.list

使用密鑰更新包管理器虽另。

bash復(fù)制

sudo apt-get update

安裝 MongoDB暂刘。

bash復(fù)制

sudo apt-get install -y mongodb

啟動(dòng)服務(wù)器。

bash復(fù)制

sudo service mongodb start

還需要安裝body-parser包捂刺,以幫助我們處理在請(qǐng)求中傳遞給服務(wù)器的 JSON谣拣。

安裝 npm 包管理器。

bash復(fù)制

sudo apt-get install npm

安裝正文分析器包族展。

bash復(fù)制

sudo npm install body-parser

創(chuàng)建名為Books的文件夾森缠,并將包含 Web 服務(wù)器配置的、名為server.js的文件添加到該文件夾仪缸。

node.js復(fù)制

var express = require('express');

var bodyParser = require('body-parser');

var app = express();

app.use(express.static(__dirname + '/public'));

app.use(bodyParser.json());

require('./apps/routes')(app);

app.set('port', 3300);

app.listen(app.get('port'), function() {

console.log('Server up: http://localhost:' + app.get('port'));

});

安裝 Express 并設(shè)置服務(wù)器的路由

Express是一個(gè)微型的靈活 Node.js Web 應(yīng)用程序框架辅鲸,為 Web 和移動(dòng)應(yīng)用程序提供功能。 本教程使用 Express 將書籍信息傳入和傳出 MongoDB 數(shù)據(jù)庫腹殿。Mongoose提供簡(jiǎn)潔的基于架構(gòu)的解決方案來為應(yīng)用程序數(shù)據(jù)建模独悴。 本教程使用 Mongoose 來為數(shù)據(jù)庫提供書籍架構(gòu)。

安裝 Express 和 Mongoose锣尉。

bash復(fù)制

sudo npm install express mongoose

Books文件夾中刻炒,創(chuàng)建名為apps的文件夾,并添加包含所定義的 Express 路由的自沧、名為routes.js的文件坟奥。

node.js復(fù)制

var Book = require('./models/book');

module.exports = function(app) {

app.get('/book', function(req, res) {

Book.find({}, function(err, result) {

if ( err ) throw err;

res.json(result);

});

});

app.post('/book', function(req, res) {

var book = new Book( {

name:req.body.name,

isbn:req.body.isbn,

author:req.body.author,

pages:req.body.pages

});

book.save(function(err, result) {

if ( err ) throw err;

res.json( {

message:"Successfully added book",

book:result

});

});

});

app.delete("/book/:isbn", function(req, res) {

Book.findOneAndRemove(req.query, function(err, result) {

if ( err ) throw err;

res.json( {

message: "Successfully deleted the book",

book: result

});

});

});

var path = require('path');

app.get('*', function(req, res) {

res.sendfile(path.join(__dirname + '/public', 'index.html'));

});

};

apps文件夾中树瞭,創(chuàng)建名為models的文件夾,并添加包含所定義的書籍模型配置的爱谁、名為book.js的文件晒喷。

node.js復(fù)制

var mongoose = require('mongoose');

var dbHost = 'mongodb://localhost:27017/test';

mongoose.connect(dbHost);

mongoose.connection;

mongoose.set('debug', true);

var bookSchema = mongoose.Schema( {

name: String,

isbn: {type: String, index: true},

author: String,

pages: Number

});

var Book = mongoose.model('Book', bookSchema);

module.exports = mongoose.model('Book', bookSchema);

使用 AngularJS 訪問路由

AngularJS提供一個(gè) Web 框架用于在 Web 應(yīng)用程序中創(chuàng)建動(dòng)態(tài)視圖。 本教程使用 AngularJS 將網(wǎng)頁與 Express 相連接访敌,并針對(duì)書籍?dāng)?shù)據(jù)庫執(zhí)行操作凉敲。

將目錄切換回到Books(cd ../..),然后創(chuàng)建名為public的文件夾寺旺,并添加包含所定義的控制器配置的爷抓、名為script.js的文件。

node.js復(fù)制

var app = angular.module('myApp', []);

app.controller('myCtrl', function($scope, $http) {

$http( {

method: 'GET',

url: '/book'

}).then(function successCallback(response) {

$scope.books = response.data;

}, function errorCallback(response) {

console.log('Error: ' + response);

});

$scope.del_book = function(book) {

$http( {

method: 'DELETE',

url: '/book/:isbn',

params: {'isbn': book.isbn}

}).then(function successCallback(response) {

console.log(response);

}, function errorCallback(response) {

console.log('Error: ' + response);

});

};

$scope.add_book = function() {

var body = '{ "name": "' + $scope.Name +

'", "isbn": "' + $scope.Isbn +

'", "author": "' + $scope.Author +

'", "pages": "' + $scope.Pages + '" }';

$http({

method: 'POST',

url: '/book',

data: body

}).then(function successCallback(response) {

console.log(response);

}, function errorCallback(response) {

console.log('Error: ' + response);

});

};

});

public文件夾中阻塑,創(chuàng)建包含所定義的網(wǎng)頁的蓝撇、名為index.html的文件。

html復(fù)制

Name:Isbn:Author:Pages:Add

NameIsbnAuthorPages{{book.name}}{{book.isbn}}{{book.author}}{{book.pages}}

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

將目錄切換回到Books(cd ..)陈莽,并通過運(yùn)行以下命令啟動(dòng)服務(wù)器:

bash復(fù)制

nodejs server.js

打開 Web 瀏覽器并導(dǎo)航到針對(duì) VM 記錄的地址渤昌。 例如http://13.72.77.9:3300。 應(yīng)顯示以下頁面所示的內(nèi)容:

在文本框中輸入數(shù)據(jù)并單擊“添加”走搁。 例如:

刷新頁面后独柑,應(yīng)會(huì)看到以下頁面所示的內(nèi)容:

可以單擊“刪除”并從數(shù)據(jù)庫中刪除書籍記錄。

后續(xù)步驟

本教程已創(chuàng)建一個(gè)可在 Linux VM 上使用 MEAN 堆棧跟蹤書籍記錄的 Web 應(yīng)用程序朱盐。 你已了解如何:

創(chuàng)建 Linux VM

安裝 Node.js

安裝 MongoDB 并設(shè)置服務(wù)器

安裝 Express 并設(shè)置服務(wù)器的路由

使用 AngularJS 訪問路由

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

轉(zhuǎn)到下一教程群嗤,了解如何使用 SSL 證書保護(hù) Web 服務(wù)器菠隆。

使用 SSL 保護(hù) Web 服務(wù)器

立即訪問http://market.azure.cn

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末兵琳,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子骇径,更是在濱河造成了極大的恐慌躯肌,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件破衔,死亡現(xiàn)場(chǎng)離奇詭異清女,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)晰筛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門嫡丙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人读第,你說我怎么就攤上這事曙博。” “怎么了怜瞒?”我有些...
    開封第一講書人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵父泳,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我,道長(zhǎng)惠窄,這世上最難降的妖魔是什么蒸眠? 我笑而不...
    開封第一講書人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮杆融,結(jié)果婚禮上楞卡,老公的妹妹穿的比我還像新娘。我一直安慰自己擒贸,他們只是感情好臀晃,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著介劫,像睡著了一般徽惋。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上座韵,一...
    開封第一講書人閱讀 51,631評(píng)論 1 305
  • 那天险绘,我揣著相機(jī)與錄音,去河邊找鬼誉碴。 笑死宦棺,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的黔帕。 我是一名探鬼主播代咸,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼成黄!你這毒婦竟也來了呐芥?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤奋岁,失蹤者是張志新(化名)和其女友劉穎思瘟,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體闻伶,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡滨攻,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蓝翰。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片光绕。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖畜份,靈堂內(nèi)的尸體忽然破棺而出诞帐,到底是詐尸還是另有隱情,我是刑警寧澤漂坏,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布景埃,位于F島的核電站媒至,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏谷徙。R本人自食惡果不足惜拒啰,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望完慧。 院中可真熱鬧谋旦,春花似錦、人聲如沸屈尼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽脾歧。三九已至甲捏,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間鞭执,已是汗流浹背司顿。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留兄纺,地道東北人大溜。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像估脆,于是被迫代替她去往敵國和親钦奋。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355

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