Express.js& Mongoose:请求参数访问Object属性名称

时间:2017-06-09 16:00:53

标签: node.js mongodb express typescript mongoose

上下文

问题是我想通过请求中传递的变量来访问Object的属性。进行GET / modify /:var请求以修改MongoDB中保存文档的属性。要知道doc的哪个属性,在获取时转换为Object,我们想修改,我们需要在:var。

中传递的字符串

路线

 public modify(req: express.Request, res: express.Response, next: express.NextFunction)
  {
    Model.findOne({attr: true}, (err, result) => {
      if (err) {
        console.log(err);
      }
      else {
        let copy = result;
        copy.attr.one.(req.params.var) = false; // here
      }
    });
  }

更新

在保罗回答之后,我编辑了我的代码并返回了500状态代码。我编辑了

router.put('/route/:var')

public mock(req: express.Request, res: express.Response, next: express.NextFunction) {
      Model.findOne({attr: false}, (err, doc) => {
        doc.attr[req.params.var] = false;
        model.save((e) => {
        if (e){
        console.log(e);
        }
          res.send(doc);
        });
    });

模型结构

export interface Model extends mongoose.Document {
  attr: {
             one:   {value: Boolean},
             two:   {value: Boolean},
             three: {value: Boolean},
             four:  {value: Boolean},
           };

}

2 个答案:

答案 0 :(得分:1)

好的,首先,你应该使用GET请求修改GET请求只是一个查询,而不改变服务器上的任何内容。

您正在寻找的是PUT请求,该请求用于修改现有资源。

其次,您尝试修改对象,但实际上还没有对象。你的findOne必须有一些东西可以查询。如果你有一个像http://example.com/modify/name这样的网址,你期望发生什么?无法告诉您要修改的名称或者您要修改的名称。

即使你只是像你建议的那样做一个布尔值,拿一个给定的bool变量并将其设置为false,你的URL也不会告诉你哪个模型应该有这个变量设为false。

相反,您可以将其设置为向(例如)/things/:thingId发出PUT请求(其中,thingId是您正在建模的任何给定Thing的唯一标识符)。这将要求您的客户端在请求正文中发送所有可更新的属性。

或者,如果您想允许它仅修改所选事物的一个属性,则可以将PUT设置为/things/:thingId/:attr。在这种情况下,您的处理程序将如下所示:

app.put('/things/:thingId/:attr', (req, res, next) => {
  // note, I normally do this kind of thing in an `app.param()` or `router.param()` call.  Included here for brevity.
  Thing.findById(req.params.thingId, (err, thing) => {
     thing[req.params.attr] = req.body[attr];
     thing.save((e) => {
        // todo: handle the error
        res.send(thing);
     });
  });
});

这里的回调比我通常做的更加嵌套,正如我所说,但希望你能得到一般的想法。

答案 1 :(得分:0)

您有查询表达式错误

Model.findOne({attr: {$exists:true}}, (err, result) => {
      if (err) {
        console.log(err);
      }
      else {
        let copy = result;
        copy.attr.(req.params.var) = false; // here
      }
    });