如何使用ExpressJS更新Cassandra记录
Apache Cassandra是一个免费且开源的分布式高扩展性宽列存储NoSQL数据库管理系统。它被设计用于处理大量的数据,并提供高可用性,没有单点故障。
本文将向您展示如何使用express js使用Cassandra,还演示了如何使用express Cassandra orm框架更新Cassandra记录。
特点: 本文使用了以下特点。
- 使用docker hub配置Cassandra docker容器。
- 使用express-cassandra orm框架在Cassandra中使用express js更新记录。
- CQLSH(Cassandra查询语言Shell)命令。
示例: 此示例在Cassandra数据存储中创建了一个名为Person的表,该表包含以下列/属性。
module.exports = {
fields:{
name : "text",
surname : "text",
age : "int",
created : "timestamp"
},
key:["name"]
}
然后使用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端点更新John(name列)的记录,将姓氏更改为Doe,年龄更改为55(有关在Cassandra中设置环境以更新记录的详细信息,请参见下面的”设置更新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使您的Node.js应用程序能够管理一个能够处理大型数据集的高可用性分布式数据存储。
- Express-cassandra使您能够像处理JavaScript对象和方法一样从Node.js中管理和查询数据。
- 模型以JavaScript模块的形式编写,它们会自动创建底层的数据库表。然后,您可以使用支持的模型方法保存、更新、删除和查询数据。
- 它的解耦性使您能够在很多流行的Node框架中使用它而不会遇到太多麻烦。
在Cassandra中设置环境以更新记录: 请按照以下步骤使用express js更新Cassandra中的记录。
步骤1: 在docker容器中设置Cassandra服务器。
请使用以下docker命令。
- docker pull cassandra:latest
- docker run -d –name cassandra-node -p 9042:9042 cassandra
- docker exec -it cassandra-node bash
- cqlsh
注意: 先决条件是安装Docker Hub以在Docker容器中运行Cassandra服务器。
请使用以下cqlsh命令来创建键空间和在Cassandra中创建教程表,以便在下一步中学习如何更新那个express.js应用程序中的记录。
- CREATE KEYSPACE test_ks WITH replication = { ‘class’: ‘SimpleStrategy’, ‘replication_factor’:1};
- use 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中将会创建一个
person
表,该表基于上述第1步中定义的模型架构。请参考以下输出。
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>
- 您现在可以通过
models.instance.Person
对象访问模型实例,其中包含支持的ORM操作。 - 请在 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记录创建一个restful终点。
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>