Sails.js将布尔查询参数处理为字符串。

3

我的“用户”模型(表)有一个名为“active”的属性(列),类型为type: 'boolean'。在查询Blueprint API时:

情况1:http://localhost:1337/user?active=true

没有返回数据。然而,

情况2:http://localhost:1337/user?active=1

表现出期望的方式。

我尝试跟踪请求,但无法超出actionUtil.js。在情况1中,where返回{active:'true'},在情况2中返回{active:'1'}。奇怪的是,将数字作为字符串转换为数字(1),但将布尔值作为字符串不会。由于ORM生成了具有类型tinyint(1)的列,因此我确定在某个地方进行了'1'到1的转换。我只需要添加另一个布尔值转换为0/1的转换。有帮助吗?

如果有人能解释一下请求跟踪,那就太好了!我不知道find.js中的exec()函数是如何定义的。

1个回答

3

我相信某个地方正在进行“1”到“1”的转换。

没错 - 在JavaScript中。打开您的JavaScript控制台并尝试:

"1" == true
"0" == false 
"true" == true
"false" == false

前两个将返回true。后两个将返回false

如果您要在蓝图中使用查询字符串,您必须处理查询字符串中的所有内容都是字符串这一事实。这意味着在其他情况下(例如小心使用 === ),需要使用10而不是truefalse


2
老实说,我之前并不知道这个。所以谢谢你告诉我。但是,我指的是在 MySQL 查询生成过程中的转换。这让我学到了另一件事情:MySQL 不区分 '1' 和 1。考虑到列类型被定义为 tinyint,这不是很奇怪吗? - Karma
2
奇怪之物不外乎是观察者眼中的东西,但在这种情况下,它相当好地被记录下来...... - sgress454
1
是的,最终这只是一个鸽洞问题:Javascript在数据库中基本上只有五种有意义的类型:Number、String、Boolean、Array和Object。数据库可以有数百种类型、自定义类型,你想要的都有。因此,任何5-->(n > 5)映射都会涉及到一些奇怪的地方。 - Travis Webb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接