想象一下,您有一个CMS,其中所有CRUD操作都通过REST API处理.
SPA包含一个adminpanel(后端)和另一个前端的单页应用程序.
使用jwt(令牌)从后端保护所有受保护的API调用很容易,但由于所有内容也通过REST API的公共端传递(对于未登录的用户),我想你可能会看到许多网站实际上在偷窃并从您的整个内容喂养:博客文章,类别,产品,页面,侧边栏等...
这是我在SPA中看到的唯一问题,例如AngularJs,那么有没有解决问题的方法呢?是否有可能不仅使用Angular + REST管理/后端系统,而且还可以将它用于前端,而不像我刚才提到的那样面对内容抓取的问题?
如果是,您如何通过您的API防止恶意内容被盗,并仍然使用您网站的内容为您的访问者提供服务?
我有一个来自 json 对象的数组:[1, 9, 12]
由于它使用方括号表示法,因为它是直接从 json 对象获取的,所以我无法将其转换为,::integer[]
当我尝试使用时,array_agg(jsonb_array_elements(simpleintarray))
我收到一条错误消息,说我需要按 id 进行分组,但由于数组不是对象(键/值) )对,但只是简单的整数,我不知道如何以相当有效的方式实现这一点。
从 json 返回上述简单 int 数组的查询是:
SELECT node.*, elem->'permissions' AS group_node_permissions
FROM node
LEFT OUTER JOIN
jsonb_array_elements(my_user_group.node_permissions) elem
ON elem->>'id' = node.id::text
ORDER BY node.id
Run Code Online (Sandbox Code Playgroud)
elem->'permissions'
理想情况下应该以 Postgres 数组的形式返回{}
,以便我稍后可以在其上使用该ANY(intarray)
函数。
我想避免做多余的低效解决方法,例如用大括号替换方括号,然后转换elem->'permissions'
为->>
整数数组,将其转换为字符串,尽管这可能会起作用。
在伪代码中,我真正需要的是能够得到相同的结果:
SELECT node.*, elem->'permissions'**::integer[]** AS group_node_permissions,
...但是当然由于json 数组与 PostgreSQL 数组格式之间的[]
差异{}
,这会导致错误。
这是我当前的(非常丑陋的解决方案,但有效):
SELECT node.*, replace(replace(elem->>'permissions', '[', '{'),']','}')::integer[] AS group_node_permissions
Run Code Online (Sandbox Code Playgroud)
它将原始的 (jsonb) 转换为(integer[])[1, 9, …
在我的应用程序的安装脚本中,我正在检查数据库是否包含任何表。如果数据库为空,我想运行 DML 和 DDL SQL 脚本。
它从一个单独的 .sql 文件中读取 SQL 并不重要,所以现在我只是将它直接放入两个字符串 - 一个用于 DDL,一个用于 DML - 并将它们连接起来。
我现在的问题是,当我尝试运行脚本以使用 .Exec(sqlStr) 生成表并将数据插入其中时,我现在收到此错误:
"pq: cannot insert multiple commands into a prepared statement"
Run Code Online (Sandbox Code Playgroud)
我当然可以做一个解决方法。就像是:
sqlStr := sqlDML + sqlDDL
sqlStmtSlice := strings.Split(sqlStr, ";")
for i:= 0; i < len(sqlStmtSlice) i++ {
// Exec() each individual statement!
}
Run Code Online (Sandbox Code Playgroud)
但是,我不确定我是否喜欢这种方法。当然必须有更好的方法来从文件加载 SQL 脚本并执行整个批处理,对吗?你知道吗?
附言。我正在使用 Go 的 PostgreSQL 驱动程序,但我认为这没有任何区别。
编辑:
由于当时似乎没有更好的解决方案来完成这项工作,因此我对上面的伪代码做了一些改进,经过测试,似乎工作得很好:
tx, err := db.Begin()
sqlStr := fmt.Sprintf(sqlDML + sqlDDL)
sqlStmtSlice := strings.Split(sqlStr, ";\r")
if err != …
Run Code Online (Sandbox Code Playgroud) 示例1:
["member1", "member2",...,..., "member100000"]
Run Code Online (Sandbox Code Playgroud)
示例2:
{
"member1": true, // (doesn't really need values, only keys :/)
"member2": true,
"...",
"member100000": true
}
Run Code Online (Sandbox Code Playgroud)
我将成员存储在每个内容的数组中,如示例 1 所示,但这样做我必须迭代数组中的 49999 个项目,才能找到成员 50000,所以我想简单地检查是否在javascript对象中定义特定的键将是一个更好的方法,虽然我不需要存储值,但只检查键是否未定义?
我需要的是能够检查是否例如。“member50000”作为我的数组中的值存在 - 或作为我的对象中的键。
我做了一些基准测试,但我不确定我是否得出了正确的结论,或者我在比较中是否做错了什么:http://jsperf.com/lolda123
根据上述测试结果,是否可以公平地得出以下结论:将键/值对保存在值为布尔值(true)的对象中,并且执行操作if(obj["member50000"])
是性能最佳的选项?即使不存在具有给定键的属性?在我看来,根据我的测试结果,检查密钥本身是否存在,在性能方面似乎要昂贵得多,但检查密钥是否存在,确实是我所需要的。
我不关心值,所以我在这里遗漏了一些东西,或者为什么更好的解决方案似乎是通过键查找值,而不是仅仅在对象内部查找键?
请考虑以下XML数据结构:
<MediaItems>
<item url="media/somefolder/pic1.jpg" id="1">
<groups>
<group>1</group>
<group>2</group>
</groups>
</item>
<item url="media/somefolder/pic2.jpg" id="2">
<groups>
<group>3</group>
<group>7</group>
</groups>
</item>
</MediaItems>
Run Code Online (Sandbox Code Playgroud)
由于我的XML数据结构/文件可能扩展到10000或者可能超过100000个媒体项元素,我需要能够在解析的Go地图(或者在这里使用什么结构?)中访问各个项目,就像我们一样map[key]type
- 但我需要能够使用url或id作为键,我无法弄清楚如何使用指向相同值的2个键创建地图.
从上面解析的XML数据结构中,我需要在Go中解析它并将其存储在如下类型中:
map[string, string]MediaItem
Run Code Online (Sandbox Code Playgroud)
其中键应该是URL和ID,所以我能够与ID 1做着获得该项目myMap["1"]
或myMap["media/somefolder/pic1.jpg"]
.两者都应该返回相应的MediaItem
.)
我无法解决如何实现这一点,或者有更好的方法来实现这一点?
最初我认为我只使用可选结构字段的指针,在最初构建它的情况下可能会为零.
随着我的代码的发展,我在我的模型上编写了不同的层 - 用于xml和json(un)编组.在这些情况下,即使是我认为总是需求的字段(Id,Name等)实际上对某些图层来说也是可选的.
最后我在所有字段前放了一个*,所以int变为*int,字符串变为*string等.
现在我想知道我是不是更好地不那么概括我的代码?我本可以复制代码,我发现它相当丑陋 - 但也许比使用指针用于所有struct字段更有效?
所以我的问题是,这是否会变成一种反模式,只是一种糟糕的习惯,或者从性能的角度来看,这种增加的灵活性是否会带来成本?
例如.你能否提出坚持选项A的好理由:
type MyStruct struct {
Id int
Name string
ParentId *int
// etc.. only pointers where NULL columns in db might occur
}
Run Code Online (Sandbox Code Playgroud)
超过这个选项B:
type MyStruct struct {
Id *int
Name *string
ParentId *int
// etc... using *pointers for all fields
}
Run Code Online (Sandbox Code Playgroud)
构建结构的最佳实践方法是从纯数据库/列的角度来看,或者例如,如果您有:
func (m *MyStruct) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
var v struct {
XMLName xml.Name `xml:"myStruct"`
Name string `xml:"name"`
Parent string `xml:"parent"`
Children []*MyStruct `xml:"children,omitempty"`
}
err := …
Run Code Online (Sandbox Code Playgroud) 我将Golang Gorilla Toolkit中的Mux包用于我的路线。
考虑以下路线:
m.HandleFunc("/admin/install", installHandler).Methods("GET")
m.HandleFunc("/admin/^((?!install).)*$", adminHandler).Methods("GET")
m.HandleFunc("/admin", adminHandler).Methods("GET")
Run Code Online (Sandbox Code Playgroud)
问题出在中间路线的正则表达式上-无法解释,因此该路线将无法工作!
m.HandleFunc("/admin/{^((?!install).)*$}", adminHandler).Methods("GET")
Run Code Online (Sandbox Code Playgroud)
大括号{}也不起作用。它只是被忽略,并被视为/ admin /
都没有:
m.HandleFunc("/admin/{_dummy:^((?!install).)*$}", adminHandler).Methods("GET")
Run Code Online (Sandbox Code Playgroud)
简而言之,我要在这里实现的是首先匹配/ admin / install路由,然后使用正则表达式将该确切的路由从下面的路由中排除,但这是行不通的。
有没有办法在大猩猩mux包中使用正则表达式?
我正在使用time.Time作为我的一个结构中的指针.例如
type struct Example{
CreatedDate *time.Time
}
Run Code Online (Sandbox Code Playgroud)
我正在使用指针,所以如果不存在日期,我可以将nil传递给结构.
然而,这确实存在问题,因为我需要使用time.Since(then)函数,它不接受指针作为参数,但需要时间.时间.
所以...
将"&"放在结构前面很容易,例如.&time.Time,但如果你有一个指针,你怎么能扭转它,回到例如.一种时间.时间?
例如.(不起作用,但可能会让你知道我的意思)
var t *time.Time = &time.Now()
var t2 time.Time = t.(time.Time)
Run Code Online (Sandbox Code Playgroud)
我希望你能提供帮助.这个问题感觉非常愚蠢,因为我在google搜索时找不到任何关于它的信息.我觉得我在这里错过了一些东西;-)
我即将在Rust中重写一个高度模块化的CMS,所以我的问题是,如果甚至可以让"核心"应用程序设置扩展点(动作/钩子),其他插件/板条箱能够"标签"到.
这样的东西就足够了,但你怎么能在Rust做到这一点?上面的体系结构使用插件注册表,并通过遍历每个插件的主要方法来迭代每个插件的主要方法.但是在Rust中,因为你不能在例如plugin_registry lib crate中拥有全局"模块"变量,我想这不是Rust中的正确思路.
是否有更好,更灵活的方式使"插件"与核心应用程序无缝集成?例如,像WordPress这样的事件调度程序会使用什么?
因为我使用的是 PostgreSQL,所以有一个名为ltree的模块的模块,它至少满足我的一个需求,性能(我不知道可扩展性?有人说物化路径树不能很好地扩展..)。
由于我正在开发的应用程序是一个完全围绕大树、节点、子树等构建的 CMS,因此对这些节点进行排队的性能绝对重要,但由于它是一个分层的大型(随着它的增长)树,您正在处理和操作GUI(CRUD),我还希望用户能够拖放以重新排序节点、子树等,同时正确更新数据库中的树(子记录)。
据我了解,在树中移动和重新排序节点/子树并不是 ltree/物化路径树真正的优点,所以我希望您能提供帮助,要么向我指出最好的正确树结构模型为了性能和移动子树和节点,或者也许......如果 ltree 确实不是过去的遗留物但仍然值得使用,那么如何使用 PostgreSQL 的 ltree 模块实现这一点?在这种情况下为什么/为什么不使用ltree?
要求:
我还在考虑闭包表,又名桥表(很多!),嵌套间隔(不确定我到底理解如何实现它,并且当前没有好的示例或要点?)或 B 树模型。我只是还不太确定,这些将如何满足我的上述 4 个要求。在嵌套间隔中重新组织子树和节点似乎很简单,而且性能似乎不错。很难选择合适的。
因为我确实需要性能(查询/读取性能)、可扩展性、排序,所以我有点认为带有排序顺序的闭包表可能非常接近,但我无法想象闭包表和磁盘空间开销将变得有多大,就像我的树一样并且节点变大。闭包表和可扩展性,我只是不太确定。我担心这个问题是错误的吗?这项任务的最佳解决方案是什么?