免责声明:这可能是一个非常无聊的问题,但我花了一天时间在网上搜索,却找不到一个答案
我要做的事情:
- 我正在用RethinkDB和deepstream.io(在node.js上)构建一个即时消息系统
- 我只想将已正确(修改并)插入RethinkDB表的记录传播到客户端
我已经设置了什么:我设置了RethinkDB,并在node.js上安装了带有RethinkDB存储连接器和RethinkDB搜索提供程序的深度流。在我的Deepstream客户端创建的记录会正确地写入我的RethinkDB。
服务器端:index.js
#!/usr/bin/env nodejs
var DSServer = require("deepstream.io");
var DSRethinkConnector = require("deepstream.io-storage-rethinkdb");
// Setup the deepstream server
var server = new DSServer();
server.set("host", "0.0.0.0");
server.set("port", 6020);
// Setup the RethinkDB storage connector
server.set("storage", new DSRethinkConnector({
port: 28015,
host: "localhost",
splitChar: "/",
defaultTable: "chat"
}));
// Run the server
server.start();
假设A:我认为这只有使用rethinkdb搜索提供程序才能实现。如果我错了,请纠正我。
假设B:我看了这个网站:https://deepstream.io/tutorials/integrations/db-rethinkdb/据我所知,它不断地从我的RethinkDB表中给我实时搜索结果,我可以说"找到最新的10条消息"。请再说一遍,如果我错了,请纠正我。
假设C:假设B中的教程告诉我得到了列表对象形式的10条最新消息。现在我在这里读到:https://deepstream.io/docs/client-js/datasync-list/每次添加新条目时,列表对象都会发出事件。(条目添加了事件)。这是正确的吗?
计划:我想使用前面提到的教程中客户端代码示例的这一部分来连续检索10条最新消息:
var queryString = JSON.stringify({
table: 'book',
query: [
['title', 'match', '^Harry Potter.*'],
['price', 'lt', 15.30]
]
})
client.record.getList('search?' + queryString)
问题A:我不知道正确的queryString必须是什么样子才能持续在rethinkdb表上保留最新10条消息的列表?
问题B:然后我想侦听列表的条目添加事件,以将新条目/消息写入客户端的dom。但我找不到一个例子/资源来解释我将如何做到这一点?
这是我当前的客户端代码:index.html
<html>
<head>
<script src="deepstream.io-client-js/dist/deepstream.min.js"></script>
</head>
<body>
...
<script>
// Connect to the deepstream server
var ds = deepstream("192.168.192.201:6020").login();
// Create a unique name for the new record
var name = "messagethread__a_b/" + ds.getUid();
// Instantiate a new record
var record = ds.record.getRecord(name);
// Set several properties of the new record
record.set({
message: "Test 123",
from: "ClientA" //this says ClientB in index2.html
});
// Subscribe to changes on the table
var queryString = JSON.stringify({
table: 'messagethread__a_b',
query: [
['title', 'match', '^Harry Potter.*'],
['price', 'lt', 15.30]
]
})
record.getList('search?' + queryString);
</script>
</body>
</html>
假设A、B和C都是正确的。正如您所描述的那样,代码片段中只缺少一些东西。
rethinkdb搜索提供程序允许"智能"查询,而这些查询在深度流本身中还不可用。
问题A的解决方案
添加条目数量限制很简单,您只需要在查询中提供几个额外的字段。
var queryString = JSON.stringify({
table: 'book',
query: [
['title', 'match', '^Harry Potter.*'],
['price', 'lt', 15.30]
],
order: 'price',
desc: true,
limit: 10
})
client.record.getList('search?' + queryString)
rethinkdb-sdk同时需要"limit"one_answers"order"。
问题B的解决方案
呼叫
client.record.getList
实际上返回了一个深度流列表对象[1],然后您可以使用它来订阅不同的事件。
你所需要做的就是:
const list = client.record.getList('search?' + queryString)
list.on('entry-added', (entryName, index) => {
// do stuff here
})
[1]https://deepstream.io/docs/client-js/datasync-list/