在 Azure 中的 Linux VM 上创建 MongoDB、Express、AngularJS 和 Node.js (MEAN) 堆栈

本教程介绍如何在 Azure 中的 Linux VM 上实现 MongoDB、Express、AngularJS 和 Node.js (MEAN) 堆栈。 通过创建的 MEAN 堆栈,可以在数据库中添加、删除和列出书籍。 你将学习如何执行以下操作:

创建 Linux VM

安装 Node.js

安装 MongoDB 并设置服务器

安装 Express 并设置服务器的路由

使用 AngularJS 访问路由

运行应用程序

Note

在 Azure 中国区使用 Azure CLI 2.0 之前,请先运行az cloud set -n AzureChinaCloud来改变云环境。如果想切回国际版 Azure,请再次运行az cloud set -n AzureCloud。

如果选择在本地安装并使用 CLI,本教程要求运行 Azure CLI 2.0.4 或更高版本。 运行az --version即可查找版本。 如果需要进行安装或升级,请参阅安装 Azure CLI 2.0

创建 Linux VM

使用az group create命令创建资源组,并使用az vm create命令创建 Linux VM。 Azure 资源组是在其中部署和管理 Azure 资源的逻辑容器。

以下示例使用 Azure CLI 在“中国北部”位置创建名为myResourceGroupMEAN的资源组。 将会创建一个包含 SSH 密钥(如果默认密钥位置不存在这些密钥)的、名为myVM的 VM。 若要使用一组特定的密钥,请使用 --ssh-key-value 选项。

Azure CLI复制

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

创建 VM 后,Azure CLI 显示类似于以下示例的信息。

Azure CLI复制

{"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 会话。 请确保使用正确的公共 IP 地址。 在上例中,我们的 IP 地址为 13.72.77.9。

bash复制

ssh azureuser@13.72.77.9

安装 Node.js

Node.js是构建在 Chrome V8 JavaScript 引擎基础之上的 JavaScript 运行时。 本教程使用 Node.js 来设置 Express 路由和 AngularJS 控制器。

在 VM 上,使用通过 SSH 打开的 bash shell 安装 Node.js。

bash复制

sudo apt-get install -y nodejs

安装 MongoDB 并设置服务器

MongoDB将数据存储在灵活的、类似于 JSON 的文档中。 数据库中的字段根据文档的不同而异,数据结构随时可发生变化。 针对示例应用程序,我们要将包含书名、ISBN 编号、作者和页数的书籍记录添加到 MongoDB。

在 VM 上,使用通过 SSH 打开的 bash shell 设置 MongoDB 密钥。

bash复制

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复制

sudo apt-get update

安装 MongoDB。

bash复制

sudo apt-get install -y mongodb

启动服务器。

bash复制

sudo service mongodb start

还需要安装body-parser包,以帮助我们处理在请求中传递给服务器的 JSON。

安装 npm 包管理器。

bash复制

sudo apt-get install npm

安装正文分析器包。

bash复制

sudo npm install body-parser

创建名为Books的文件夹,并将包含 Web 服务器配置的、名为server.js的文件添加到该文件夹。

node.js复制

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 并设置服务器的路由

Express是一个微型的灵活 Node.js Web 应用程序框架,为 Web 和移动应用程序提供功能。 本教程使用 Express 将书籍信息传入和传出 MongoDB 数据库。Mongoose提供简洁的基于架构的解决方案来为应用程序数据建模。 本教程使用 Mongoose 来为数据库提供书籍架构。

安装 Express 和 Mongoose。

bash复制

sudo npm install express mongoose

Books文件夹中,创建名为apps的文件夹,并添加包含所定义的 Express 路由的、名为routes.js的文件。

node.js复制

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文件夹中,创建名为models的文件夹,并添加包含所定义的书籍模型配置的、名为book.js的文件。

node.js复制

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提供一个 Web 框架用于在 Web 应用程序中创建动态视图。 本教程使用 AngularJS 将网页与 Express 相连接,并针对书籍数据库执行操作。

将目录切换回到Books(cd ../..),然后创建名为public的文件夹,并添加包含所定义的控制器配置的、名为script.js的文件。

node.js复制

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文件夹中,创建包含所定义的网页的、名为index.html的文件。

html复制

Name:Isbn:Author:Pages:Add

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

运行应用程序

将目录切换回到Books(cd ..),并通过运行以下命令启动服务器:

bash复制

nodejs server.js

打开 Web 浏览器并导航到针对 VM 记录的地址。 例如http://13.72.77.9:3300。 应显示以下页面所示的内容:

在文本框中输入数据并单击“添加”。 例如:

刷新页面后,应会看到以下页面所示的内容:

可以单击“删除”并从数据库中删除书籍记录。

后续步骤

本教程已创建一个可在 Linux VM 上使用 MEAN 堆栈跟踪书籍记录的 Web 应用程序。 你已了解如何:

创建 Linux VM

安装 Node.js

安装 MongoDB 并设置服务器

安装 Express 并设置服务器的路由

使用 AngularJS 访问路由

运行应用程序

转到下一教程,了解如何使用 SSL 证书保护 Web 服务器。

使用 SSL 保护 Web 服务器

立即访问http://market.azure.cn

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

推荐阅读更多精彩内容