Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 在ajax请求中传递查询条件的最佳实践_Node.js_Ajax_Rest_Logical Operators - Fatal编程技术网

Node.js 在ajax请求中传递查询条件的最佳实践

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

我正在节点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。 在我使用的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表达式解析器;如果您已经使用了其中的一些解析器,您能告诉我哪一个是您最喜欢的吗?