如何在不使用模型的情况下按ID更新文档

时间:2017-10-05 21:14:05

标签: node.js database mongodb express mongoose

我有卡片模型,我有一个API,我在那里按ID查找文件。

app.post("/api/postcomment", async (req,res) => {
  const data = req.body
  const reqUrl = req.headers.referer
  const re = new RegExp('([a-zA-Z0-9]*$)', 'i')
  const fixedUrl = reqUrl.match(re)

  try {
    await Card.update({_id: fixedUrl}, {$push:{'comments': data}})
    const card = await Card.findById(fixedUrl)
    return res.json(card)
  } catch (err) {
    throw err
  }
})

工作正常。但是现在我还有更多的模特。所有人都应该以同样的方式对待他们。但是,我如何才能使这个代码可以重用于每个模型? 或者也许有办法将我的模型名称传递给API?然后像这样使用它:

app.post("/api/postcomment", async (req,res, modelName) => {
  const data = req.body
  const reqUrl = req.headers.referer
  const re = new RegExp('([a-zA-Z0-9]*$)', 'i')
  const fixedUrl = reqUrl.match(re)

  try {
    await modelName.update({_id: fixedUrl}, {$push:{'comments': data}})
    const item = await modelName.findById(fixedUrl)
    return res.json(item )
  } catch (err) {
    throw err
  }
})

1 个答案:

答案 0 :(得分:0)

解决方案1:您可以创建两个辅助函数并从路由器调用。两个函数都接受模型对象:

let updateDocument = (model, fixedUrl, data) => {
  return model.update({ _id: fixedUrl }, { $push: { comments: data }})
}

let getDocument = (model, fixedUrl) => {
  return model.findById(fixedUrl)
}

app.post("/api/postcomment", async (req, res, modelName) => {
  const data = req.body
  const reqUrl = req.headers.referer
  const re = new RegExp('([a-zA-Z0-9]*$)', 'i')
  const fixedUrl = reqUrl.match(re)

  try {
    await updateDocument(Card, fixedUrl, data)
    const item = await getDocument(Card, fixedUrl)
    return res.json(item )
  } catch (err) {
    throw err
  }
})

解决方案2:更好的解决方案是创建具有通用功能的基类(服务)。并为每个模型扩展它:

class BaseService {
  constructor(model) {
    this.model = model;
  }

  getDocument(data) {
    return this.model.findOne(...);
  }

  updateDocument(data) {
    return this.model.update(...);
  }
}

class CardService extends BaseService {
  constuctor() {
    super(Card);
  }
}