【问题标题】:How to pass a query string from Angular to ExpressJS如何将查询字符串从 Angular 传递到 ExpressJS
【发布时间】:2017-08-13 16:12:21
【问题描述】:

我正在使用 Express + MongoDB 本机驱动程序(不是 MONGOOSE),我想创建一个 API 端点,可以“过滤”我的结果。

结构:
在我的组件中,我有 30 个“过滤器”(选择框),并且我的“xxxx”集合中有 5000 多个文档以目录方式显示。每次用户单击提交时,我都想向 MongoDB 发送查询并将结果更新到我的目录中。这可以通过服务+订阅来完成,这很好。我的问题是创建可以使用查询的 API 端点。

我有一个 Angular 组件,它有大约 30 个选择框,其中每个值都是查询字符串的片段。

考虑以下选择框:

<select name="test" form="myform">
  <option value="{'name': 'Volvo'}">Volvo</option>
  <option value="{'name': 'Honda'}">Honda</option>
</select>

<select name="test2" form="myform">
  <option value="{'model': 'ILX'}">ILX</option>
  <option value="{'model': 'MDX'}">MDX</option>
</select>

表单提交时,要通过如下查询来表达:

 /filter/test/{{'name': 'Honda'},{'model': 'ILX'}}

这是我的快速端点的(“理想”)代码(这会产生错误):

router.get('/filter/test/:query', function(req, res) {
  var collection = db.get().collection('xxxxxx')

  collection.find({ query }).toArray(function(err, docs) {
    res.send(docs)
  })

})

问题:
1.我怎样才能从这个表单中传递一个查询(或字符串)来表达? (我相信它是我提交按钮的操作标记中的 API 端点)
2. 如何正确构建这个 API 端点?
3. 这样的事情在生产中是否安全/可靠?如果没有,我该如何保护它或有什么更好的实施方式?

【问题讨论】:

    标签: node.js mongodb rest angular express


    【解决方案1】:

    这取决于您正在开发什么。如果您的数据不太敏感,请将其放在 url 参数中并发送 get 调用,如果数据敏感,请使用 post 或 patch 调用。这就是rest api对删除的作用,使用delete调用,不要直接提交表单给rest api尝试使用ajax在后台点击api。

    创建一个这样的表单

     <form action="/filter/test/{{test}}/{{model}}">
      <select name="test" [(ngModel)]="test" form="myform">
      <option [value]=" 'Volvo'">Volvo</option>
      <option [value]="'Honda'">Honda</option>
     </select>
    
     <select name="test2" [(ngModel)]="model" form="myform">
       <option [value]="'ILX'">ILX</option>
       <option [value]="'MDX'">MDX</option>
      </select>
    </form>
    

    并像这样在 api 中读取它

     router.get('/filter/test/:test/:model', function(req, res) {
      var collection = db.get().collection('xxxxxx')
    
       collection.find({ test : req.params.test, model : req.params.model }).toArray(function(err, docs) {
        res.send(docs)
        })
      })
    

    如果您有多个字段并且您有一个案例,用户将填写其中的一些字段,而有些则不使用补丁/帖子,因为我的建议是像这样创建您的角度模型

    let data = {
     field1: "",
     field2: "",
     ...
     }
    

    现在在你的表单模型中使用 field1、field2 和 rest 并使用 ajax 调用 post/patch 这个数据对象直接到你不需要 url 参数的 rest 端点现在提取并在 req.body 中验证它们你会找到它们。为此,您需要在 nodejs 中添加一个 json 解析器。

    【讨论】:

    • 非常感谢您的回复@babar-bilal。好的,所以我将添加我的 30 个潜在过滤器;现在我的问题是:假设用户只使用 5/30 过滤器。 (他们只想选择品牌、型号、(最小-最大)价格和类别(即轿车),但是,他们将“hosepower”过滤器保留为默认值(空白,无值。)我如何处理空参数?跨度>
    • http://localhost:3000/api/filter/test/Honda/""/ 返回[] 这不是预期的行为。此外,感谢您的更新,但是,我不明白您使用数据对象 @babar-bilal 的方法
    • Api 正在返回这个 [] ?
    • 是的 - 数据库不返回任何内容,链接 .toArray 并没有包围 [ ]
    • 首先纠正 url 中的内容检查 ia 收到的内容以及在查询中发送到数据库的内容,以便对其进行调试以了解流程
    猜你喜欢
    • 2016-05-22
    • 1970-01-01
    • 1970-01-01
    • 2017-11-02
    • 1970-01-01
    • 2015-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多