我具有使用PostgreSQL的ltree模块构建的这种物化路径树结构。
我当然可以轻松地使用ltree从整棵树或特定路径/子路径中获取所有节点,但是当我这样做时,自然地,我得到的是很多行(等于节点中的节点的数组/切片)结束.. Golang /您使用的任何编程语言)
我要做的是将树(理想情况下是从某个起点和终点的路径/点)作为树状JSON树对象等来获取
{
"id": 1,
"path": "1",
"name": "root",
"children": [
{
"id": 2,
"path": "1.2",
"name": "Node 2",
"children": [
{
"id": 3,
"path": "1.2.3",
"name": "Node 3",
"children": [
{
"id": 4,
"path": "1.2.3.4",
"name": "Node 4",
"children": [
]
}
]
},
{
"id": 5,
"path": "1.2.5",
"name": "Node 5",
"children": [
]
}
]
}
]
}
Run Code Online (Sandbox Code Playgroud)
我从线性(非分层)行/数组/切片结果集中知道,我当然可以在Golang中进行分解,并在其中进行创建此json的必要业务逻辑,但是如果有方便的话,肯定会好得多直接通过PostgreSQL实现此目标的方法。
那么,您如何在PostgreSQL中将ltree树形结构输出到json-从起始路径到结束路径都集中地?
如果您不知道ltree,我想这个问题可能会进一步推广到“分层路径树到分层json”
我也在考虑在ltree路径之外的所有节点上添加一个parent_id的想法,因为至少那样我就可以使用使用该id的递归调用来获取我猜的json ...我也考虑过根据父ID的更改发生时间在该parent_id上放置触发器以管理路径(保持更新)-我知道这是另一个问题,但是也许您也可以告诉我您的观点,对此吗?
我希望有一些天才可以帮助我。:)
为了方便起见,这里有一个示例创建脚本,可用于节省时间:
CREATE TABLE node …Run Code Online (Sandbox Code Playgroud) 我有以下react组件,它在初始页面加载时获取Ajax数据,如下所示:
var MyTable = React.createClass({
getInitialState: function() {
return {
rows: [
['Something, ' '],
['Something else', ' '] ]
};
},
componentDidMount: function() {
var self = this;
$.get('http://domain.com/api/Orders/from-date/' + fromDate + '/to-date/' + toDate,
function(result) {
var newState = React.addons.update(this.state, {
rows: {
0: {
1: { $set: result }
}
}
});
this.setState(newState);
}.bind(this)
);
},
render: function() {
return (
<Table
rowHeight={50}
rowGetter={(rowIndex) => {
return this.state.rows[rowIndex];
}}
rowsCount={this.state.rows.length}
onRowClick={this._onRowClick}
width={1000}
height={342}
groupHeaderHeight={40}
headerHeight={0}>
<ColumnGroup label="Products" …Run Code Online (Sandbox Code Playgroud) 当前,无论何时传入新数据,我都使用Socket.io / SignalR从后端消息队列系统发出事件。这样,我可以在React应用程序中设置事件处理程序,并从事件处理程序中更新中继缓存。
这似乎不是最常用的Graphql方法,所以我在RFC之前的实时查询实现中进行了一些尝试,在该实施例中,您观察到反应式数据存储中的数据更改将其推向Graphql服务器,再到客户端使用websockets ...带有一些相当复杂的自定义代码...显然,graphql还没有准备好进行实时查询(不是轮询)
再往后几行说:
建立基于事件的订阅时,确定事件触发条件的问题很容易,因为该事件明确定义了事件。事实证明,在现有消息队列系统之上实施也是很简单的。
这使我想到了我的问题。当新事件传入后端消息队列应用程序并且您需要实时在ui中反映此新数据时(以秒为单位),您如何(以graphql方式)最佳触发graphql订阅?我不是在谈论在前端/客户端中触发事件,也不是像在谈论订阅时通常看到的那样x秒钟轮询一次。
不确定是否相关,但是我将Relay Modern用作我的首选graphql客户端。
如果我得到一点帮助来大致了解如何触发/调用订阅而不会发生突变,那么以下一些想法可能会起作用。
后端工作程序/消息队列“ A”接收带有某些设备数据的新传入事件。它使用SignalR或其他pubsub(redis / socket.io /?)通知graphql服务器“ B”(预订该事件)发生了新事件。然后,graphql服务器触发/执行订阅,并且前端反应中继应用程序“ C”会自动更新,因为它已定义了中继订阅。这将是理想的,对吗?但是如何在graphql服务器上触发订阅?
只需使用Socket.io/SignalR从传入数据上的后端工作程序/消息队列“ A”发出事件,订阅并处理前端“ B”中的事件,然后从Socket.io/SignalR事件内部以编程方式调用订阅处理程序(如果这样的话,甚至可以直接调用订阅吗?)。但是,使用订阅而不是使用纯Socket.io/SignalR进行的唯一改进是,我将中继缓存/存储的更新从处理程序移到了订阅。如果有的话,没有太大的改进。但是手动更新缓存/存储确实很麻烦,尽管不是那么困难:/
人们如何使用Signalr处理实时流式传输(设备)实时数据,为什么所有的实时文章/示例都只是重复相同的旧的简单聊天应用程序,而ui只是在用户单击事件后进行更新?graphql是否还不适合实时处理频繁进入的设备数据流?我了解为什么实时查询在自己实施后会被延迟,但是如果没有实时查询,实时查询会将实时查询更新从服务器推送到前端吗?
我知道中继文档指出 react-router v4/5 对 Relay 不好,因为它们改为动态路由,但如果你仔细观察,它总是说:
“Jimmy Jia 于 2017-6-3 上次更新”
而且我也真的不想使用“Found Relay”。
我希望仍然能够访问我的 QueryRenderer 或 useQuery 而不是其上的抽象,所以你不能,这就是 Found 正在做的,所以这是不行的。
所以......随着刚刚发布的 Relay Modern v6,并在中继实验中偷偷摸摸地使用 useQuery、useFragment 等与 React Suspense 和 @defer(希望如此)集成的钩子即将到来 - 有什么建议和最好的2019 年使用 Relay Modern v6 处理嵌套路由的实践。
与 Suspense 的集成是不是动态路由开始变得更有意义了?
有很多关于非常简单的中继应用程序的例子,比如https://github.com/relayjs/relay-examples/,但到目前为止我还没有找到一个很好的例子来展示如何在中继中处理嵌套路由合适的方式。通过“以适当的方式”,我不是在谈论使用“发现中继”,而是使用仅执行“路由”部分并且做得很好的路由器。
根据Aurelia的创建者Rob Eisenberg的说法,应该可以在彼此内部嵌套aurelia应用程序.
由于他在上述链接中提到的例子不再公开,如果这里的任何人可以进一步详细说明,甚至链接或写一个关于如何实现这种嵌套的小例子,这将是非常有用的.
我希望用Aurelia创建的主要应用程序和界面将包含一个Windows XP桌面样式shell,其中一个可以从开始菜单打开嵌套的Aurelia应用程序,在主应用程序内的嵌入式窗口中打开"Windows桌面区域" - 就像Windows或文件浏览器将在正常的Windows XP操作系统中打开,但在SPA内部.
为了使这个真正可扩展,我宁愿保留将嵌套aurelia应用程序放在主应用程序根文件夹之外的文件夹中的可能性,而是使用磁盘上的文件/文件夹路径从主应用程序链接到它们.
因此,为了保持"简单",想象这将是主要应用程序(Windows shell) - 单击按钮打开一个窗口,可以最小化,调整大小或移动.在那个窗口中,另一个aurelia应用程序将打开.最后,您希望能够将某些状态从主应用程序转移到嵌套应用程序,例如.语言或数据库.
如果可能,最好是嵌套应用程序可以从主应用程序根文件夹外部定位和引用.
我需要以某种方式将JSON对象推送到可能存在的JSON对象的嵌套数组 - 请参阅下面的JSON代码段中的"pages".
{
"session_id": "someuuid",
"visitor_ui": 1,
"pages": [
{
"datetime": "2016-08-13T19:45:40.259Z",
"duration,": 0,
"device_id": 1,
"url": {
"path": "/"
}
},
{
"datetime": "2016-08-14T19:45:40.259Z",
"duration,": 0,
"device_id": 1,
"url": {
"path": "/test"
}
},
// how can i push a new value (page) here??
]
"visit_page_count": 2
}
Run Code Online (Sandbox Code Playgroud)
我知道jsonb_set(target jsonb, path text[], new_value jsonb[, create_missing boolean])(虽然仍然觉得它有点难以理解)但我想使用它,需要我首先SELECT整个JSONB列,以便找出"页面"中已经存在多少元素和什么索引推动它使用jsonb_set,对吗?我希望在Postgres 9.5/9.6中有一种方法可以达到我们在编程语言中所知的相同程度.pages.push({"key": "val"}).
使用Postgresql 9.5或9.6这是最好和最简单的方法吗?
应用1:我有一个React应用程序(基于create-react-app),我在Azure中添加了一个Web应用程序 - 这非常简单易用.这是使用JS SignalR客户端与服务器通信,如下所述.
应用程序2:此应用程序是使用dotnet新控制台创建的ASP.NET Core SignalR Server应用程序.此应用程序公开SignalR端点并且是"自托管".
应用3:第二个ASP.NET Core控制台应用程序设置为SignalR客户端.它负责获取一些数据,并将这些数据发送到SignalR服务器.这将SignalR端点(url)作为命令行参数.
在本地运行所有这些非常简单:
应用1:npm start/serve -s build
.应用2:DOTNET运行以从所提供的ARGS一个hubpath和端口在localhost -CommandLine ARGS(运行的端口是为了让多个实例SignalR服务器可以在本地主机上运行 - 不知道这是做在Azure中,或者如果方式他们与单独的网址区分开来并单独托管在那里)
应用3:dotnet运行" http:// localhost:5000/somenotificationhubname "
我在每个控制台应用程序中添加了一个bat文件,因此我可以使用不同的args打开这些应用程序的多个实例.
所以本地运行就像点击3个bat文件一样容易.
但我对如何在Azure中托管所有这些感到失望.网络应用程序似乎非常简单.我刚刚在Azure中创建了一个Web应用程序,通过FTP客户端连接到它,并从React应用程序复制到build文件夹的内容.
但是如何处理ASP.NET Core控制台应用程序,以便SignalR控制台应用程序将在Azure中托管,并为其他2个应用程序公开其端点?
我尝试在应用程序1下添加App 2和3作为webjobs,但这似乎不起作用.
我也听说过SignalR不应该在IIS上运行,所以让它自包含(exe)并在docker容器中运行是否有意义?任何帮助深表感谢.
在本地我们可以做dotnet run [args]或dotnet publish遵循dotnet mydll.dll [args].
在App Services下将该App部署到Azure Web App时,如何使用这些命令行参数启动它?
创建新的 React 前端应用程序套件的第一步是最好在 Go 中创建一个简单的身份验证服务器/服务,用户可以使用他们的 google 帐户进行身份验证,这将导致:
我意识到我将从 Auth 服务器/服务获取 JWT,其中包含通常的声明,例如:
{
"iss":"accounts.google.com",
"at_hash":"HK6E_P6Dh8Y93mRNtsDB1Q",
"email_verified":"true",
"sub":"10769150350006150715113082367",
"azp":"1234987819200.apps.googleusercontent.com",
"email":"jsmith@example.com",
"aud":"1234987819200.apps.googleusercontent.com",
"iat":1353601026,
"exp":1353604926,
"nonce": "0394852-3190485-2490358",
"hd":"example.com"
}
Run Code Online (Sandbox Code Playgroud)
到目前为止一切顺利,但之后我不太确定需要为用户“表”存储哪些字段(使用 dgraph 数据库,但我想它是关系数据库还是图形数据库并不重要)除了电子邮件之外的数据库,据我了解,这将是将数据库中的用户与 JWT 配对的标识符?
您如何处理与您自己的数据库的集成:
您是否将令牌与电子邮件一起存储在用户表中?在这种情况下,如果令牌过期/更改该怎么办以及安全性如何?
所以问题不在于如何获取令牌,而在于如何将数据库中的用户与刚刚通过身份验证的 JWT 用户连接起来。
我读过的大多数教程和文章都没有详细描述数据库部分。
In all the examples I can find on memoization / internal function cache in Functional Programming in JavaScript, the examples are either mutating or reassigning the cache.
Here's an example taken from https://scotch.io/tutorials/understanding-memoization-in-javascript#toc-a-functional-approach
function memoizer(fun){
let cache = {}
return function (n){
if (cache[n] != undefined ) {
return cache[n]
} else {
let result = fun(n)
cache[n] = result
return result
}
}
}
Run Code Online (Sandbox Code Playgroud)
The only tiny improvement I can come up with is to use reassigning instead of …