Node.js 在ajax请求中传递查询条件的最佳实践
我正在节点js中编写一个restapi,它将执行一个sql查询并发送结果; 在请求中我需要发送WHERE条件;例:Node.js 在ajax请求中传递查询条件的最佳实践,node.js,ajax,rest,logical-operators,Node.js,Ajax,Rest,Logical Operators,我正在节点js中编写一个restapi,它将执行一个sql查询并发送结果; 在请求中我需要发送WHERE条件;例: GET 127.0.0.1:5007/users //gets the list of users GET 127.0.0.1:5007/users id = 1 //gets the user with id 1 现在,条件从客户端传递到请求头中的RESTAPI。 在我使用的AP
GET 127.0.0.1:5007/users //gets the list of users
GET 127.0.0.1:5007/users
id = 1 //gets the user with id 1
现在,条件从客户端传递到请求头中的RESTAPI。
在我使用的API中,sequelize是一种需要接收特定形式(对象)的WHERE条件的ORM;例:具有以下条件:
(x=1 AND (y=2 OR z=3)) OR (x=3 AND y=1)
需要将其格式化为嵌套对象:
-- x=1
-- AND -| -- y=2
| -- OR ----|
| -- z=3
-- OR -|
|
| -- x=3
-- AND -|
-- y=1
因此,目标是:
Sequelize.or (
Sequelize.and (
{x=1},
Sequelize.or(
{y=2},
{z=3}
)
),
Sequelize.and (
{x=3},
{y=1}
)
)
现在我试图传递一个简单的字符串(比如“(x=1和(y=2或z=3))或(x=3和y=1)”,但是我需要服务器上的一个函数,可以在需要的对象中转换字符串(在我看来,这种方法的优点是开发人员编写客户机,可以用一种简单的方式传递where条件,比如使用sql,而且这种方法也独立于使用的ORM,如果我们需要更改服务器或使用不同的ORM,则无需更改客户机)
读取条件字符串并将其转换为对象的函数让我头疼(我正在尝试编写一个函数,但没有成功,因此如果您有一些关于如何执行类似操作的示例…)
我希望得到的是能够执行几乎任何类型sql查询的路由,并给出结果:
现在我有了一条不同的路线:
127.0.0.1:5007/users //to get all users
127.0.0.1:5007/users/1 //to get a single user
127.0.0.1:5007/lastusers //to get user registered in the last month
对于我需要查询的其他表,依此类推(对于客户端中我需要的每种请求,都有一条路由);
相反,我希望只有一条路线,比如:
127.0.0.1:5007/request
(调用此路由时,我将传递表名和条件字符串)
你认为这个解决方案是一个好的解决方案,还是你通常使用其他方法来处理这类事情?
您知道如何编写函数将条件字符串转换为所需对象吗
任何建议都将不胜感激;)我强烈建议您不要向客户公开数据库模型的任何部分。这样做意味着你不能在不破坏客户的情况下改变你暴露的任何东西。就您所提供的内容而言,一个建议是您可以而且应该使用查询参数来减少端点的数量
GET /users //to get all users
GET /users?registeredInPastDays=30 //to get user registered in the last month
GET /users/1 //to get a single user
显然,“registeredInPastDays”应该改名为不那么笨拙的东西。。这只是一个例子
就条件字符串而言,应该有大量在线可用的解析器。语法看起来非常简单。您的解决方案的主要缺点是您只创建了另一个用于查询数据的API。如果sthm已经创建,为什么要从头开始创建它?您应该使用现有成熟的查询API,关注您的业务逻辑,而不是发明新的sthm
例如,您可以从Odata获取查询语法。长期以来,许多人一直在制定该标准。他们已经考虑了查询API的不同用例和障碍 资源使用URI定位。您可以使用或混合使用三种方法来解决这些问题:
/users/john/posts/4711
/users/john/posts?minvows=10&minViews=1000&tags=java
/用户;国家=乌克兰/邮政
和以及或连接。但您可以使用自定义或标准查询语法。例如,如果你想找到除卡普里以外的所有福特汽车,价格在10000美元到20000美元之间,谷歌会使用搜索参数
q=cars+OR+vehicles+%22ford%22+-capri+%2410000..%2420000
(%22
是转义的“
,%24
是转义的$
)
如果这不适用于您的情况,并且您希望在URI之外传递数据,则格式取决于您的喜好。添加自定义标题(如X-Filter
)可能是一种有效的方法。我倾向于使用POST
。尽管您只想查询数据,但如果您将请求视为创建搜索结果资源:
POST /search HTTP/1.1
your query-data
服务器应在位置标头中返回新创建的资源:
HTTP/1.1 201 Created
Location: /search/3
结果仍然可以缓存,您可以将其添加书签或发送链接。缺点是您需要额外的POST
我同意;构建一个执行所有类型查询的单一maxi路由应该是将API端点减少到1的一种方法(除其他特殊路由外);我正在寻找js表达式解析器;如果您已经使用了其中的一些解析器,您能告诉我哪一个是您最喜欢的吗?