我是卡桑德拉的新手,刚刚安装,想试一试.因此,我try 了以下代码:

import cassandra from 'cassandra-driver';

const client = new cassandra.Client({
  contactPoints: ['localhost'],
  localDataCenter: 'datacenter1',
  keyspace: 'ks1'
});

const query1 = "CREATE TABLE users(name text , emailtext, PRIMARY_KEY(email, name)) VALUES('someone' , 's@s.com')";
const query2 = 'SELECT name, email FROM users WHERE name = ?';

await client.execute(query1);

await client.execute(query2)
  .then(result => console.log('User with email %s', result.rows[0].email));

但我得到的结果是:

> cassandra_test@1.0.0 start
> ts-node-esm src/index.ts

/home/a/bars/cassandra_test/node_modules/cassandra-driver/lib/readers.js:389
    const err = new errors.ResponseError(code, message);
                ^
ResponseError: Keyspace 'ks1' does not exist
    at FrameReader.readError (/home/a/bars/cassandra_test/node_modules/cassandra-driver/lib/readers.js:389:17)
    at Parser.parseBody (/home/a/bars/cassandra_test/node_modules/cassandra-driver/lib/streams.js:209:66)
    at Parser._transform (/home/a/bars/cassandra_test/node_modules/cassandra-driver/lib/streams.js:152:10)
    at Parser.Transform._write (node:internal/streams/transform:175:8)
    at writeOrBuffer (node:internal/streams/writable:392:12)
    at _write (node:internal/streams/writable:333:10)
    at Parser.Writable.write (node:internal/streams/writable:337:10)
    at Protocol.ondata (node:internal/streams/readable:766:22)
    at Protocol.emit (node:events:513:28)
    at Protocol.emit (node:domain:489:12) {
  info: 'Represents an error message from the server',
  code: 8704
}

问题出在哪里?我该如何解决它?

PS:我用的是Ubuntu 22.04和NodeJS版本9.

EDIT:我try 创建KEYSPACE,然后编辑代码如下:

import cassandra from 'cassandra-driver';

const client = new cassandra.Client({
  contactPoints: ['localhost'],
  localDataCenter: 'datacenter1',
  keyspace: 'ks1'
});

const query0 = "CREATE TABLE users(name text, email text, PRIMARY_KEY(email, name))";
const query1 = "INSERT INTO users(name, email) VALUES ('someone' , 's@s.com')";
const query2 = "SELECT name, email FROM users WHERE name = someone";

await client.execute(query0 );
await client.execute(query1);

await client.execute(query2)
  .then(result => console.log('User with email %s', result.rows[0].email));

但仍然会出现另一个错误:

> cassandra_test@1.0.0 start
> ts-node-esm src/index.ts

/home/a/bars/cassandra_test/node_modules/cassandra-driver/lib/readers.js:389
    const err = new errors.ResponseError(code, message);
                ^
ResponseError: line 1:53 no viable alternative at input '(' (... text, email text, PRIMARY_KEY[(]...)
    at FrameReader.readError (/home/a/bars/cassandra_test/node_modules/cassandra-driver/lib/readers.js:389:17)
    at Parser.parseBody (/home/a/bars/cassandra_test/node_modules/cassandra-driver/lib/streams.js:209:66)
    at Parser._transform (/home/a/bars/cassandra_test/node_modules/cassandra-driver/lib/streams.js:152:10)
    at Parser.Transform._write (node:internal/streams/transform:175:8)
    at writeOrBuffer (node:internal/streams/writable:392:12)
    at _write (node:internal/streams/writable:333:10)
    at Parser.Writable.write (node:internal/streams/writable:337:10)
    at Protocol.ondata (node:internal/streams/readable:766:22)
    at Protocol.emit (node:events:513:28)
    at Protocol.emit (node:domain:489:12) {
  info: 'Represents an error message from the server',
  code: 8192,
  coordinator: '127.0.0.1:9042',
  query: 'CREATE TABLE users(name text, email text, PRIMARY_KEY(email, name))'
}

我不知道新的错误有什么问题?

推荐答案

所以ks1键空间并不存在.您需要创建它.

为此,您可以使用cqlsh工具(在Cassandra的bin/目录中找到). 由于您的集群看起来像是单个本地 node ,并且没有安全活动,因此只需执行以下操作即可进入该集群:

$ bin/cqlsh

进入后,您可以使用以下命令创建密匙空间:

CREATE KEYSPACE ks1 WITH replication = {'class':'SimpleStrategy', 'replication_factor' : 1};

这是解决这个问题的最快方法.

EDIT

在查看CQL查询之后,上面也有一些错误.CREATE TABLE语句不允许在创建时插入值.因此,这些查询需要是两个独立的查询:

const query1 = "CREATE TABLE users(name text , email text, PRIMARY KEY(email, name))"
const query1b = "INSERT INTO users (name,email) VALUES('someone' , 's@s.com')";

await client.execute(query1);
await client.execute(query1b);

请注意,在CREATE TABLE语句中,我还更正了email textPRIMARY KEY之间的空格.

此外,query2看起来像是在使用问号?绑定预准备语句中的变量.但我看不出这是在哪里发生的.当您了解到这一点时,请查看Parameterized Queries上的Node.js驱动程序的DataStAX文档.

还要注意,按照该表的主键的 struct 方式,它只能按emailemailname进行查询.但仅靠name是不能查询的.

谢谢!有没有办法也可以使用NodeJS而不是cqlsh来创建KEYSPACE?

所以简短的回答是"我不推荐这样做."

长久以来的答案是,Cassandra会将模式复制到每个 node ,而编程模式更改可能会受到网络问题的影响.也就是说,由于键空间是连接属性的一部分,因此在您有机会运行CREATE KEYSPACE语句之前,它可能会失败.

Node.js相关问答推荐

利用Gemini:通过Vertex AI还是通过Google/generative-ai?

如何使用NodeJS在mongodb中更新文档

Socket.io 未将用户加入给定房间

即使卷已设置,Docker Nodemon 也不会热重载

如果我在 tsx 文件中使用了use client,ssr 会如何发生?

在mongoose虚拟属性中处理异步操作

加速 sequelize ORM 中的查询

当其中一个端点不工作时,如何使用 axios.all() 调用多个 API?

try 在 NodeJS 项目中实现 SimplePay (OTP) 支付网关,但我无法获得与技术文档中相同的签名

将 AllowDiskUse true 添加到 node.js 中的 MongoDB 聚合?

NodeJS 后端发布请求将数据作为NULL值发布到 SQL Server 表

为什么我的 Heroku Express API 数据是持久的,即使它只是来自一个变量

如何更改NodeJS中的堆栈大小限制?

使用 grunt 服务器,如何将所有请求重定向到根 url?

来自 Node-aws 的 Dynamo Local:所有操作都失败无法对不存在的表执行操作

如何在 Mongoose 模式中设置数组大小限制

如何在 NodeJs 中下载和解压缩内存中的 zip 文件?

Node.js -Firebase 服务帐户私钥不会解析

如何使用 cookie 创建 HTTP 客户端请求?

从 node.js 连接到 mongodb 时出现 ECONNREFUSED 错误