本教程介绍如何在 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:AddNameIsbnAuthorPages{{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 服务器。
立即访问http://market.azure.cn
网友评论