使用ApsaraDB for MongoDB将数据存储在云上的方法

在本教程中,我们将使用阿里巴巴云的ApsaraDB for MongoDB来将数据存储到云端。

这个博客是从英文版翻译而来的。原始版本请点击此处确认。我们部分使用了机器翻译。若发现翻译错误,请指出,不胜感激。

阿里巴巴云计算技术分享的作者是Sai Sarath Chandra。

在上一次的教程中,我们创建了一个发票应用的用户界面。然而,正如我们在最初的文章中所解释的那样,桌面应用程序面临着丢失宝贵数据的风险。

因此,此次我們將使用阿里巴巴雲的ApsaraDB for MongoDB來將數據存儲在雲端。通過將數據存儲在雲端,不僅可以在Android、iOS、Web應用程序等應用程序之間跨平台使用數據,還可以隨時獲取數據。阿里巴巴雲使數據始終可用。此外,我們還可以隨時根據業務需要充分利用阿里巴巴雲提供的自動彈性擴展功能。

应用程序后端设置

在这里,我们将解释一下发票生成应用程序的后端。

此API是基于Node服务器和ExpressJS框架创建的。

我們首先將這個庫的代碼克隆下來,然後將其移動到 “Invoice_Backend” 文件夾中。接下來,使用您喜歡的文本編輯器打開這些文件。

我只对两个文件感兴趣。

    • Package.json

 

    • このファイルには、開発依存関係などの依存関係に関するすべての情報が格納されています。

 

    • Server.js

 

    ロジックを記述する重要なファイルです。本番環境では、Loopback のようなフレームワークを使用して、より多くの制御が可能な高性能な API を作成することをお勧めします。

在package.json中,提供了一组标准依赖关系。

    • Sprint-JS、mongoDB、node-UUID、formidable – データベースに接続し、実行時にURLを作成するためのものです。

 

    • Expressとbody-parser – は、APIを作成し、受信したリクエストをJSON形式で取得するために使用されます。

 

    Server.jsでは、次のようなコードがあります。
 http.createServer(app).listen(443, function () {
  console.log('Server for Invoice Backend running on port 443!');
});

请确保在开始之前拥有以下导入语句,这是创建一个在443端口接收HTTP请求的标准方法。

const bodyParser = require("body-parser");
const express = require("express");
const app = express();
var uuid = require('node-uuid');
var http = require('http');
var fs = require('fs');
var sprintf = require("sprintf-js").sprintf;
var mongoClient = require('mongodb').MongoClient;

这些导入文件都是为了确保应用程序正常运行所必需的。

使用app.use(bodyParser.json());

在将数据传递到数据库之前,将该行中的body信息解析为json格式。

在这里,当应用程序通过console.log()行时,您可以立即查看信息,并使用控制台了解发生了什么。在生产环境中,不建议使用控制台语句。相反,您应该使用具有适当日志格式的方式来实现相同的功能。

// ApsaraDB for MongoDB related configurations
var host1 = "dds-6gj540e0c157941.mongodb.ap-south-7.rds.aliyuncs.com";
var port1 = 3012;
var host2 = "dds-6gj54080c157942.mongodb.ap-south-7.rds.aliyuncs.com";
var port2 = 3012;
var username = "root";
var password = "Mongodb@12345";
var replSetName = "mgset-1050000641";
var demoDb = "admin";

在使用MongoDB时,需要通过这个途径来连接数据库并执行操作。

app.post('/data/invoice', (req, res) => {
  console.log(req.body);   
  var saveData = saveInvoiceData(req.body); 
  saveData.then(function(dbResponse){
    console.log(dbResponse);
    res.status(201).send(dbResponse);

  },function(err){
    console.log(err);
    res.status(400).send(err);
  });
});

当点击应用程序的发送按钮时,会触发后续处理。在内部,会调用saveInvoiceData函数进行处理。

saveInvoiceData方法连接到数据库,进行身份验证,并查找集合,将数据推送到数据库中。

function saveInvoiceData(collectionData) {

  console.log(collectionData);
  return new Promise(function (resolve, reject) {
    // Logic to fetch from the MongoDB
    mongoClient.connect(url, function (err, db) {
      //if error console error
      console.log(err);
      if (err) {
        // Database not connected : error thrown
        console.error("connect err:", err);
        reject(err);
      } else {
        //Database connected successfully, get the DB Object
        var adminDb = db.admin();
        //Authenticate Database
        adminDb.authenticate(username, password, function (err, result) {
          if (err) {
            console.log("authenticate err:", JSON.stringyfy(err));
            reject(err);
          } else {
            console.log('Authenticated : ', JSON.stringify(result));
            // Get the Collection handle.
            var collection = db.collection("saleData");
            collection.insertOne(collectionData,function(err,result){
              if(err){
                reject(err);
              }else{
                resolve(result);
              }
            });
          }
        });
      }
    });
  });
}

这种方法接收collectionData的JSON对象。其他的信息可以通过查看方法的注释轻而易举地获得。在这里,注意数据被推送到“saleData”集合中。

获取与仪表板相关的数据的GET方法如下所示。

app.get('/data/dashboard', (req, res) => {
  var getData = getDashboardData();
  getData.then(function(result){
    res.status(200).send(result);
  },function(err){
    console.log(err);
    res.status(400).send(err);
  });
});

GET方法调用”getDashboardData()”来获取和处理数据,并创建响应。

function getDashboardData() {

  return new Promise(function (resolve, reject) {
    // Logic to fetch from the MongoDB
    mongoClient.connect(url, function (err, db) {
      //if error console error
      console.log(err);
      if (err) {
        // Database not connected : error thrown
        console.error("connect err:", err);
        reject(err);
      } else {
        //Database connected successfully, get the DB Object
        var adminDb = db.admin();
        //Authenticate Database
        adminDb.authenticate(username, password, function (err, result) {
          if (err) {
            console.log("authenticate err:", JSON.stringyfy(err));
            reject(err);
          } else {
            console.log('Authenticated : ', JSON.stringify(result));
            // Get the Collection handle.
            var collection = db.collection("saleData");
            collection.find({}).toArray(function (err, items) {
              if (err) {
                console.error('Unable to find data' + JSON.stringify(err));
              } else {
                console.info('data Fetched from MongoDB');
                var response = {}; 

                var datesArr = [];
                var salesArr = [];
                var ordersArr = [];

                var i =0;
                for(i=0; i<5; i++){
                  var totalSales = 0;
                var totalOrders = 0;
                  var d = new Date();
                  d.setDate(d.getDate() - i);
                  var month = d.getMonth() + 1;
                  var day = d.getDate();
                  var output = d.getFullYear() + '/' + (month < 10 ? '0' : '') + month + '/' + (day < 10 ? '0' : '') + day;
                  datesArr.push(output);
                console.log("In Loop 1 : "+i);
                  for(var k=0; k<items.length; k++){
                    var item = items[k];
                    if(item.invoiceDate == output){
                      totalSales = totalSales + item.totalAmount;
                      totalOrders = totalOrders+1;
                    }
                  }
                  salesArr.push(totalSales);
                  ordersArr.push(totalOrders);
                }
                response.datesArr = datesArr;
                response.salesArr = salesArr;
                response.ordersArr = ordersArr;
                resolve(response);
              }
            });
          }
        });
      }
    });
  });
}

这里写了很多东西。点击以下的URI,就会变成以下的样子。

请求:GET
http:// VM IP : PORT>/data/dashboard

回应:

{
    "datesArr": [
        "2018/03/25",
        "2018/03/24",
        "2018/03/23",
        "2018/03/22",
        "2018/03/21"
    ],
    "salesArr": [
        0,
        4197.3,
        34,
        0,
        0
    ],
    "ordersArr": [
        0,
        1,
        1,
        0,
        0
    ]
}

调用getInvoiceData()函数时,会连接到数据库,并对数据进行验证,然后从集合中提取数据。该方法会执行一个循环,通过当前数据查看过去5天的订单数量和总销售额,并将数据存入相对应的数组中。

由于上述响应是发送到GET方法中的,所以会对整个数据执行for循环,并将响应构建到相应的数组中。这是一个CPU密集型的任务,因此已将其外部化到部署在阿里巴巴云ECS实例上的中间件上。

过去,我们通常需要将应用程序集成到终端,并确保接收到的数据以合适的格式呈现。因此,我尝试使用一个简单的客户端postman。

邮递员

以下是POSTMAN的截图。

image.png
    • GET、POST、PUT、PATCH、DELETEのような異なるメソッドを呼び出すことができます。

 

    • URI/アドレスバーがあり、クエリパラメータも受け付けることができます。

 

    • 送信ボタンをクリックしてリクエストを行い、レスポンスを取得します。

 

    あなたはこれについての詳細を探ることができます、あなたはテストケースやピークパフォーマンステストを実行することができます。これはあなたが商業目的でそれを使用することができます。無料のツールです。

API的部署

如果已经设置了阿里巴巴云ECS,那应该不难理解。如果不清楚,请参考其他关于创建ECS实例的教程。

创建MongoDB实例的步骤:
1、在阿里云控制台上启用ApsaraDB for MongoDB。
2、转到ApsaraDB for MongoDB控制台,选择适当的区域。
3、点击“创建实例”按钮。
4、仔细选择基础设施相关的设置,如RAM和带宽。
5、如果使用密码,请小心保管以备将来使用/参考。将用于身份验证的代码。
6、预览并同意使用条款,然后创建实例。
7、创建实例后,转到实例详情并将ECS实例的IP添加到白名单中。
8、转到白名单规则,将显示“导入ECS IP”按钮。点击按钮后,ECS内网IP将自动导入。
9、几秒钟后,您应该能够在控制台上看到显示的”连接字符串”。使用此信息,您可以连接ApsaraDB for MongoDB上的GUI MongoDB客户端。
10、其他个别信息是连接MongoDB所需的代码信息。请在代码中替换此信息以连接到数据库。

执行代码

在将代码复制到ECS实例后,需要执行以下命令以确保正常运行。

1. 使用npm安装
a. 这个包将从npm仓库下载并安装所需的所有包。
2. 使用npm start / node app.js
a. 这将启动应用程序,当服务器启动后,应该可以调用API。

结论
本文介绍了Electron JS是什么。还创建了与后端API一起的用户界面。还探讨了如何利用ApsaraDB for MongoDB桌面应用程序为客户提供附加值的产品。

所有的代码都可以在GitHub仓库中找到。如果有任何问题,请通过下面的链接作为提案提出。

请提供原文中的英文句子或短语,以便我能够准确理解并用中文进行翻译。

如果您认为您能够改善代码,请将其以pull请求的形式提交。

阿里巴巴云拥有2个数据中心在日本,并且是亚太地区第一的云基础设施服务提供商拥有超过60个可用区域(2019年Gartner报告)。
欲了解更多有关阿里巴巴云的详细信息,请点击此处查看。
阿里巴巴云日本官方网页。

广告
将在 10 秒后关闭
bannerAds