使用Astra DB和Datastax的API构建后端应用程序
Apache Cassandra是流行的分布式NoSQL数据库管理系统之一。它通过分区和复制保证了其基础设施的可扩展性和可靠性。然而,这种形式的云原生开发通常是缓慢而复杂的。
Astra DB是一个零配置的无服务器数据库,它无缝地抽象了Apache Cassandra云原生服务的数据库和流媒体操作。
本文解释了Apache Cassandra和Astra DB的基本原理。然后,我们将使用Node.js和Datastax的文档API对博客数据库进行CRUD操作。我们将创建表格,读取数据库记录,进行更新和删除。
前提条件
- 你需要一个[Astra DB]的数据库账户。
- 在你的开发系统上安装[Node.js]运行时。
- 一个IDE,我推荐[VS Code]用于开发。
数据库设置
首先,你需要登录到DataStax。我使用我的GitHub账户。连接你的谷歌账户,甚至使用你的电子邮件和密码。

登录成功后,你将进入你的AstraDB仪表板。然后,在仪表板的左侧面板上,点击create database 。

要创建一个无服务器数据库,选择一个名称和一个密钥空间。Apache Cassandra将使用钥匙空间来将数据分组。在我的案例中,我将把数据库命名为cassandra-demo ,并把blog 作为关键空间。

"文档中提到键空间是一个桶,将容纳你的表。你可以为表组创建不同的关键空间"。
Datastax的Astra DB分布在不同地区。因此,在完成数据库设置之前,要从选项中挑选一个提供商。在我的案例中,我将选择GCP,地区为美东1。

向数据库插入数据
由于Apache Cassandra是一个NoSQL,它将数据组织在集合中。当我们创建一个Cassandra集合时,它会自动暴露一个REST或GraphQL API作为端点,我们可以与数据库中的数据进行交互。我们将利用我们的Node.js应用程序中的文档API网关。
我们需要创建一个新的令牌,以便在我们的应用程序中访问DataStax的数据库。前往 DataStax Astra DB 仪表板。在面板上,点击连接。
这显示了我们可以访问我们的应用程序的各种方式,包括REST和GraphQL APIs。我们将使用文档API;前往先决条件下,点击链接创建一个新的应用程序令牌。

在这个项目中,我们将使用Administrator role 来访问数据库安全中的每一个权限。现在,复制生成的Client ID 、Token 、Client Secret ,并将它们存储在你的env 文件中。
由于我们没有创建接口,我们将使用curl命令行来插入数据。
发出POST请求的curl命令将类似于下面的内容。
curl --request POST \
--url https://$ASTRADB_ID-$ASTRADB_REGION.apps.astra.datastax.com/api/rest/v2/namespaces/$ASTRA_DB_KEYSPACE/collections/members \
-H "X-Cassandra-Token: $ASTRADB_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"title": "New Title",
"description": "descriptive stuff...",
"author": "john doe"
}'
要插入更多的数据,用不同的标题重新运行这个命令,以插入更多的数据。然而,不要忘记改变json主体中的title,description, 和author 。
项目设置
在你的终端上,创建一个项目文件夹并将其命名为astra-app-demo 。
mkdir astra-app-demo
接下来,在该文件夹中导航并在你的IDE中打开它。
cd astra-app-demo && code .
为了启动这个项目,使用命令npm init -y 来初始化它,创建一个package.json 文件。
现在让我们来安装以下依赖项。
我们的Node.js应用程序将需要来自npm的以下包。
-
Express:
express是一个低开销的Node.js网络应用程序框架,在请求和响应周期中依赖于中间件。 -
@strajs/collections:这是在AstraDB中作为我们的文档星门API的驱动的模块。DataStax使用Stargate API网关从我们的Node.js应用程序进行连接。 -
Dotenv:由于我们使用的是无服务器数据库,我们需要一种方法来存储API密钥。它从我们的应用程序中的
.env文件中注入环境变量,避免了硬编码任何敏感数据。确保在你的.gitignore文件中添加一个.env,而不是将其推送到GitHub仓库中。 -
Nodemon:
nodemon模块监控我们应用程序的变化,并重新启动我们的应用程序服务器。
在你的终端上,使用下面的命令安装这些包。
npm i express @astrajs/collections dotenv nodemon
Node.js 14和最新版本已经支持ES模块。
要开始使用这一功能,请前往你的package.json并添加。
"type": "module",
接下来,在我们的astra-app-demo 目录内创建一个条目index.js 文件,并添加以下代码来启动我们的服务器。
// import express and dotenv package installed above
import express from 'express'
import dotenv from 'dotenv'
// instantiate our express app
const app = express()
// enable env varibales for .env file
dotenv.config()
// a basic index route
app.get('/', (req,res)=>{
res.send("You're in the index page")
})
// run application on Port:: 5000
app.listen(5000, () => {
console.log(`server running: port:: 5000`)
})
然后在你的package.json ,添加nodemon 脚本,重新启动我们的服务器。
"scripts": {
"dev": "nodemon index.js"
},
如果一切正常,请到你的浏览器上localhost:5000 。

恭喜你,服务器的设置已经启动并运行了!在接下来的章节中,我们将使用Node.js中的Document API和@astrajs/collections ,操作我们的DataStax Astra数据库。
连接和检索数据
我们现在可以将最初生成的凭证添加到.env 文件中。在.gitignore ,确保排除其提交到GitHub公共仓库。
该文件应该如下所示。
ASTRA_DB_REGION = us-east1
ASTRA_DB_KEYSPACE = stackr
ASTRA_DB_APPLICATION_TOKEN= YOUR_DB_APPLICATION_CLIENT_TOKEN
ASTRA_DB_CLIENT_ID= YOUR_CLIENT_ID
ASTRA_DB_CLIENT_SECRET= YOUR_CLIENT_SECRET
在我们的index.js 文件的顶部,让我们从@astrajs/collections 中导入createClient 与。
import { createClient } from "@astrajs/collections"`
由于我们正在与API交互,express使用中间件来解析JSON和URL编码的数据,如下所示。
// enable json and url encoded data
app.use(express.json())
app.use(express.urlencoded({extended: false}))
然后我们需要创建一个集合客户端的实例,createClient 。然后,调用函数,将前面设置的环境变量作为对象参数传递给它。
// create an Astra DB client
const astraClient = await createClient({
astraDatabaseId: process.env.ASTRA_DB_ID,
astraDatabaseRegion: process.env.ASTRA_DB_REGION,
applicationToken: process.env.ASTRA_DB_APPLICATION_TOKEN,
})
为了简化数据库的收集,我们将为我们将要工作的集合创建。
const collection = astraClient.namespace("stackr").collection("testcollection")
这个集合需要一个命名空间,也就是关键空间,以及一个集合名称。我们将它们分别命名为stackr 和testcollection 。
让我们前往列出我们集合中的所有博客。创建一个GET 路由来列出所有的集合。
来自collection 实例的find 方法是返回集合中所有记录的方法。
// get all documents
app.get('/blogs', async (req, res) => {
const blogs = await collection.find({})
return res.json(blogs)
}
在GET 端点下,我们返回一个带有博客的JSON响应。我将使用雷霆客户端VS代码扩展。欢迎使用任何其他的REST API客户端,如postman或insomnia。
如果我们提出一个GET 的请求,AstraDB会发回以文档ID为关键的数据。


在AstraDB中创建文档
要在一个集合中创建一个文档,使用POST HTTP动词与一个端点,如/new 。来自collection 实例的create 方法将创建一个新的文档。
为了测试这一点,前往雷霆客户端并添加一个包括title 、description 、和author 的主体。
// post route
app.post('/new', async(req, res) => {
const {title, description, author} = req.body
const newUser = await collection.create({
title: title,
description: description,
author: author
})
// return a success msg with the new doc
return res.json({data: newUser, msg: 'user created successfully'})
})
在上面的代码中,使用去结构化的语法,我们将这些值传递给collection.create() 。我们的响应返回一个成功信息和新创建的文档。

更新AstraDB中的文档
对于这个操作,再添加一个/update 端点。在REST中,更新操作使用PUT HTTP动词。Astra Document API暴露了collection.update( ) 方法来更新任何基于集合下的ID的文档。
// updating docs
app.put('/update', async(req, res)=>{
const {title, description, author} = req.body
const updatedUser = await collection.update("1b4a845d-7460-4971-a8a7-0ef371771d85", {
title: title,
description: description,
author: author
})
return res.json({data: updatedUser, msg: 'user updated successfully'})
})

在AstraDB中删除文档
要删除记录,请用/delete REST端点添加一个DELETE 。在这种情况下,我们根据文档的ID来执行删除操作。
如果文档不存在,我们返回一个404错误信息。如果成功,我们的API会返回一个JSON响应,即`用户成功删除。
app.delete('/delete', async(req,res)=>{
const user = await collection.delete("1b4a845d-7460-4971-a8a7-0ef371771d85")
if(!user){
return res.json({msg: '404 user not found'})
}
return res.json({msg: 'user deleted successfuly'})
})

结论
作为开源产品,Apache Cassandra是一个受欢迎的数据库,因为它能够在分布式云基础设施中保持无缝的可扩展性和一致性。
将这些技术特性与DataStax stargate API网关相结合,使我们有能力开发一个零配置的无服务器数据库。该数据库是无服务器的,它有一个很好的免费层和开发者体验。