我正在使用 Neo4j,它有一个子句允许一次设置多个属性:
MATCH (p:Person)
WHERE p.email = '${userEmail}'
SET p += ${argsToUpdate}
RETURN p AS Person
但是,我无法将 argsToUpdate
放入查询中,因为 Neo4j 正在查找与此处显示的字符串完全相同的字符串:
{ email: 'test@test.com', age: 1337, colour: 'blue' }
我可以使用 JSON.stringify(argsToUpdate)
正则表达式并去掉\和 "但这不太好,因为某些属性可能包含这些字符。也许可以先对它们进行编码。
我还尝试了JSON.parse(JSON.stringify(argsToUpdate))
。
我使用了 util.inspect(argsToUpdate)
并且它工作得很好,但我的开发负责人不会接受它,因为它是一个 Node.js 调试方法。
是否有一种简单的方法可以通过另一种方式实现这一目标?
我不想做像这样的 for 循环之类的事情:
let args = '{ '
for (let i = 0; i < Object.keys(argsToUpdate).length; i++) {
args += `${prop[i]}: ${key[i]}`
}
args += ' }'
有没有有效的方法来做到这一点?问题在于 argsToUpdate 包含的属性数量可变。我希望它是动态的,这样代码就不会那么脆弱。 ES6+ 中是否有任何可用的东西(包括 babel)可以实现 util.inspect(argsToUpdate) 的结果?
最佳答案
假设您使用默认的 neo4j 驱动程序,您应该能够以标准 javascript 数据结构将所有参数传递给查询,而不必担心像这样的字符串转义。我认为问题在于您的参数命名不正确。
Cypher 参数必须由 unicode 字母组成,并且不能以货币符号开头。用反引号括起来的名称可以包含空格。因此,应采用如下形式。
{someParam}
$someParam
或者甚至是像下面两个这样的东西。
{ `some param with spaces in the name` }
$`some param with spaces in the name`
考虑到这一点,下面的查询应该可以工作。
session
.run('MATCH (p:Person) WHERE p.email = $userEmail SET p += $argsToUpdate RETURN p AS Person', {userEmail: 'test@test.com', argsToUpdate: { email: 'test@test.com', age: 1337, colour: 'blue' }})
关于json - 字符串化对象时如何从对象中删除引号和反斜杠(不使用正则表达式),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45801770/