Node.js 如何将查询字符串从Angular传递到ExpressJS

Node.js 如何将查询字符串从Angular传递到ExpressJS,node.js,mongodb,rest,angular,express,Node.js,Mongodb,Rest,Angular,Express,我使用的是Express+MongoDB本机驱动程序而不是MONGOOSE,我想创建一个API端点,它可以“过滤”我的结果 结构: 在我的组件中,我有30个过滤器选择框,我的“xxxx”集合中有5000多个文档以目录方式显示。每次用户单击submit,我都会向MongoDB发送一个查询,并将结果更新到我的目录中。这可以通过服务+订阅来完成,这很好。我的问题是创建可以使用查询的API端点 我有一个角度组件,它有大约30个选择框,其中每个值都是一个查询字符串的片段 考虑以下选择框: <sele

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

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

我有一个角度组件,它有大约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>
这是我的express端点的“理想”代码。这会产生错误:

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.如何将此表单中的查询或字符串传递给express?我相信它是提交按钮动作标记中的API端点 2.如何正确构造此API端点?
3.这样的东西在生产中安全吗?如果没有,我如何保护它,或者什么是更好的实现?

这取决于您正在开发什么。如果您的数据不太敏感,请将其放入url参数并发送get调用,如果数据敏感,请使用post或补丁调用。这就是RESTAPI为删除所做的使用delete调用,不要直接将表单提交给RESTAPI尝试在幕后使用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>
 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: "",
 ...
 }
如果您有多个字段,并且您有一个案例,那么用户将填充其中的一些字段,而有些字段不使用patch/post作为我的建议,创建这样的角度模型

 <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>
 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将此数据对象直接发送到rest端点,您不需要url参数,现在在req.body中提取并验证它们,您将找到它们。为此,您需要在nodejs中添加一个json解析器。

非常感谢您的回复@babar bilal。好的,我将添加30个潜在过滤器;现在我的问题是:假设用户只使用5/30过滤器。他们只想选择品牌、型号、最低最高价格和类别,即轿车,但是,他们将hosepower过滤器默认值保留为空,没有值。如何处理空参数?http://localhost:3000/api/filter/test/Honda// 返回[]这不是预期的行为。此外,感谢您的更新,但是,我不理解您使用数据对象@babar Bilapi返回此[]的方法?是-数据库不返回任何内容,并且链接。toArray不使用[]环绕任何内容首先纠正url中的错误,检查ia接收到的内容以及在查询中发送到数据库的内容,然后对其进行调试以了解流程