📜  如何使用 ExpressJS 更新 Cassandra 中的记录?

📅  最后修改于: 2022-05-13 01:56:34.031000             🧑  作者: Mango

如何使用 ExpressJS 更新 Cassandra 中的记录?

Apache Cassandra 是一个免费的开源、分布式、高度可扩展、宽列存储、NoSQL 数据库管理系统。它旨在处理大量数据,提供无单点故障的高可用性。

本文将向您展示如何使用 express js 使用 Cassandra,并展示如何使用 express Cassandra orm 框架更新 Cassandra 中的记录。

特点:本文使用了以下特点。

  • 使用 docker hub 配置 Cassandra docker 容器。
  • 使用 express-cassandra orm 框架使用 express js 更新 Cassandra 中的记录。
  • CQLSH(Cassandra 查询语言外壳)命令。

示例:此示例在 Cassandra 数据存储中创建具有以下列/属性的人员表。

Javascript
module.exports = {
   fields:{
       name    : "text",
       surname : "text",
       age     : "int",
       created : "timestamp"
   },
   key:["name"]
}


index.js
var express = require('express');
var app = express();
var models = require('express-cassandra');
 
// Tell express-cassandra to use the models-directory, and
// use bind() to load the models using cassandra configurations.
models.setDirectory( __dirname + '/models').bind(
   {
       clientOptions: {
           contactPoints: ['127.0.0.1'],
           protocolOptions: { port: 9042 },
           keyspace: 'test_ks',
           queryOptions: {consistency: models.consistencies.one}
       },
       ormOptions: {
           defaultReplicationStrategy : {
               class: 'SimpleStrategy',
               replication_factor: 1
           },
           migration: 'safe'
       }
   },
   function(err) {
       if(err) throw err;
   }
);


PersonModel.js
module.exports = {
   fields:{
       name    : "text",
       surname : "text",
       age     : "int",
       created : "timestamp"
   },
   key:["name"]
}


index.js
// code snippet from the index.js file
app.get('/person/:name/:surname/:age', function(req, res) {
   res.send('name: ' + req.params.name+', surname:'+req.params.surname+', age:'+req.params.age);
   var person = new models.instance.Person({
       name: req.params.name,
       surname: req.params.surname,
       age: parseInt(req.params.age),
       created: Date.now()
   });
   person.save(function(err){
       if(err) {
           console.log(err);
           return;
       }
       console.log('person saved!');
   });
});


index.js
// code snippet from the index.js file
app.put('/person/:name/:surname/:age?', function (req, res) {
   models.instance.Person.findOne({name: req.params.name }, function(err, person){
       if(err) throw err;
       if(person){
           if(req.params.surname){
               person.surname = req.params.surname;
           }
           if(req.params.age){
               person.age = parseInt(req.params.age);
           }
           person.save(function(err){
               if(err) console.log(err);
               else console.log('Person got updated...');
           });
       }
   });
   res.send('person updated');
 })


然后它使用 express-cassandra 使用 expressjs restful 端点插入一条记录

cqlsh> select * from test_ks.person;
name | age | created                         | surname
------+-----+---------------------------------+---------
John |  32 | 2021-04-02 11:05:00.946000+0000 |     Doe

然后它在 Express RESTful 端点的帮助下用姓 Doe 和年龄 55 更新 John(name column) 记录(请参阅下面的设置环境以更新 Cassandra 部分中的记录更多详细信息)。

cqlsh> select * from test_ks.person;
name | age | created                         | surname
------+-----+---------------------------------+---------
John |  55 | 2021-04-02 11:05:00.946000+0000 |     Doe
(1 rows)
cqlsh>

应用:

  • Express-cassandra 使您的 nodejs 应用程序能够管理能够处理大型数据集的高可用性分布式数据存储。
  • Express-cassandra 使您能够像处理 javascript 对象和方法一样从 nodejs 管理和查询。
  • 模型被编写为 javascript 模块,它们会自动创建底层数据库表。然后您可以使用支持的模型方法保存、更新、删除和查询您的数据。
  • 它的解耦特性使您可以轻松地将其与许多流行的节点框架一起使用。

在 Cassandra 中设置更新记录的环境:请找到以下步骤来使用 express js 在 Cassandra 中更新记录。

第 1 步:在 docker 容器中设置 Cassandra 服务器。

请使用以下 docker 命令。

  • 码头工人拉卡桑德拉:最新
  • docker run -d –name cassandra-node -p 9042:9042 cassandra
  • docker exec -it cassandra-node bash
  • qlsh

注意:先决条件是安装 docker hub 以在 docker 容器中运行 cassandra 服务器。

请使用以下 cqlsh 命令在 Cassandra 中创建密钥空间并创建一个教程表,以了解如何更新该 express.js 应用程序中的记录以进行后续步骤。

  • CREATE KEYSPACE test_ks WITH replication = { 'class': 'SimpleStrategy', 'replication_factor':1};
  • 使用 test_ks;

第 2 步:设置 express js 应用程序。

请找到以下命令

  • mkdir mycassandratutorial
  • cd mycassandratutorial
  • npm init(请提供所有详细信息,如项目名称、作者等……)
  • npm install –save express
  • npm install express-cassandra

注意:先决条件是安装node以运行 express js 应用程序。

第 3 步:使用 express-cassandra 设置 cassandra 连接。

  • 请找到以下 index.js 文件,其中配置了 Cassandra 服务器 IP 地址和端口号以及架构等。

index.js

var express = require('express');
var app = express();
var models = require('express-cassandra');
 
// Tell express-cassandra to use the models-directory, and
// use bind() to load the models using cassandra configurations.
models.setDirectory( __dirname + '/models').bind(
   {
       clientOptions: {
           contactPoints: ['127.0.0.1'],
           protocolOptions: { port: 9042 },
           keyspace: 'test_ks',
           queryOptions: {consistency: models.consistencies.one}
       },
       ormOptions: {
           defaultReplicationStrategy : {
               class: 'SimpleStrategy',
               replication_factor: 1
           },
           migration: 'safe'
       }
   },
   function(err) {
       if(err) throw err;
   }
);
node index

笔记:

  • 现在,您将在 cassandra 中根据上述第 1 步中定义的模型模式创建一个“person”表。请参考以下输出。
root@76561f8b27a2:/# cqlsh
Connected to Test Cluster at 127.0.0.1:9042.
[cqlsh 5.0.1 | Cassandra 3.11.10 | CQL spec 3.4.4 | Native protocol v4]
Use HELP for help.
cqlsh> select * from test_ks.person;
name | age | created | surname
------+-----+---------+---------
(0 rows)
cqlsh>         
  • 您现在可以访问包含支持的 orm 操作的 `models.instance.Person` 对象中的模型实例。
  • 请在models文件夹下找到以下 PersonModel.js 文件。

PersonModel.js

module.exports = {
   fields:{
       name    : "text",
       surname : "text",
       age     : "int",
       created : "timestamp"
   },
   key:["name"]
}

注意:实际上 PersonModel.js 映射到 Cassandra 表并使用 express-cassandra 框架执行所有 CRUD 操作。

第 4 步:使用 express js restful API 更新 Cassandra 中的记录。

  • 为在 Cassandra 中创建新的 Person 记录创建一个安静的端点。

index.js

// code snippet from the index.js file
app.get('/person/:name/:surname/:age', function(req, res) {
   res.send('name: ' + req.params.name+', surname:'+req.params.surname+', age:'+req.params.age);
   var person = new models.instance.Person({
       name: req.params.name,
       surname: req.params.surname,
       age: parseInt(req.params.age),
       created: Date.now()
   });
   person.save(function(err){
       if(err) {
           console.log(err);
           return;
       }
       console.log('person saved!');
   });
});
  • 您可以通过 Web 浏览器以 http://localhost:3000/person/John/Doe/32 访问此端点,然后您可以在 Cassandra Person 表中创建记录。
root@76561f8b27a2:/# cqlsh
Connected to Test Cluster at 127.0.0.1:9042.
[cqlsh 5.0.1 | Cassandra 3.11.10 | CQL spec 3.4.4 | Native protocol v4]
Use HELP for help.
cqlsh> select * from test_ks.person;
name | age | created                         | surname
------+-----+---------------------------------+---------
John |  32 | 2021-04-02 11:05:00.946000+0000 |     Doe
(1 rows)
cqlsh>
  • 通过 express js restful 端点从 Cassandra 更新 Person 记录。

index.js

// code snippet from the index.js file
app.put('/person/:name/:surname/:age?', function (req, res) {
   models.instance.Person.findOne({name: req.params.name }, function(err, person){
       if(err) throw err;
       if(person){
           if(req.params.surname){
               person.surname = req.params.surname;
           }
           if(req.params.age){
               person.age = parseInt(req.params.age);
           }
           person.save(function(err){
               if(err) console.log(err);
               else console.log('Person got updated...');
           });
       }
   });
   res.send('person updated');
 })
  • 您可以通过 curl 命令访问此端点,如下所示。
    注意:下面的 curl 命令将 John Doe 的年龄从 32 岁更新到 55 岁。
MINGW64 ~
$ curl -v -X PUT http://localhost:3000/person/John/Doe/55                                                               *   Trying 127.0.0.1:3000...
* TCP_NODELAY set
* Connected to localhost (127.0.0.1) port 3000 (#0)
> PUT /person/John/Doe/55 HTTP/1.1
> Host: localhost:3000
> User-Agent: curl/7.67.0
> Accept: */*
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< X-Powered-By: Express
< Content-Type: text/html; charset=utf-8
< Content-Length: 14
< ETag: W/"e-TKKHGLrHAbIKlf0bIe4gdwzz0N0"
< Date: Fri, 02 Apr 2021 11:11:37 GMT
< Connection: keep-alive
<
person updated* Connection #0 to host localhost left intact
  • 请找到以下 Cassandra Person 表输出。
root@76561f8b27a2:/# cqlsh
Connected to Test Cluster at 127.0.0.1:9042.
[cqlsh 5.0.1 | Cassandra 3.11.10 | CQL spec 3.4.4 | Native protocol v4]
Use HELP for help.
cqlsh> select * from test_ks.person;
name | age | created                         | surname
------+-----+---------------------------------+---------
John |  55 | 2021-04-02 11:05:00.946000+0000 |     Doe
(1 rows)
cqlsh>