如何使用 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>