上下文
问题是我想通过请求中传递的变量来访问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},
};
}
答案 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
}
});