【问题标题】:Node.js with express insert new field into existing mongoDB document from server side带有快速将新字段从服务器端插入现有 mongoDB 文档的 Node.js
【发布时间】:2019-01-02 17:45:54
【问题描述】:

您好,我正在寻找一种方法,使用 node.js 和 express 将新字段从服务器端动态插入到现有的 mongoDB 文档中。

例如在本地 mongoDB 中,文档如下所示。

 {
 value: 'Google',
  url: 'https://google.com',
  env: 'Test'
 }

我有一个路由,它已经从 UI 上的表单更新了当前文档字段。但是,我想将该逻辑与在更新时插入新字段的能力相结合。

下面的路由处理使用现有字段更新文档。

router.put("/:id", (req, res) => {
  let value = req.body.value;
    Application.findByIdAndUpdate(req.params.id, req.body.application, (err, 
       updatedApp) => {
      if(err){
        console.log(err);
      } else {
        console.log(updatedApp)
        req.flash("info", updatedApp.value  + " " + "successfully edited!");
        res.redirect("/qa-hub/applicationmanager");
      }
    });
});

在前端,我使用带有表单的 EJS 来更新文档。示例如下:

<div class="row">
      <div class="col-md-6">
        <div class="form-group">
          <input class="form-control" type="url" name="application[url]" value="<%= application.url %>" required>
        </div>
      </div>
    </div>

    <div class="row">
      <div class="col-md-6">
        <div class="form-group">
          <select class="form-control" name="application[env]" required="true">
            <option class="text-center" value='<%= application.env %>'><%= application.env %></option>
            <option value='Beta'>Beta</option>
            <option value='Dev'>Dev</option>
            <option value='Does Not Apply'>Does Not Apply</option>
            <option value='Prod'>Prod</option>
            <option value='QA'>QA</option>
            <option value="Test">Test</option>
          </select>
        </div>
      </div>
    </div>
    <div class="row">
      <div class="col-md-4">
        <div class="form-group">
          <a class="btn btn-outline-warning" href="/qa-hub/applicationmanager">Cancel</a>
        </div>
        <div class="form-group">
          <button class="btn btn-outline-primary" id="btn" >Update</button>

但是,我想在提交表单时添加三个附加字段。我想捕获执行编辑的当前登录用户以及日期和时间。我已经解决了这个问题,但是如何实现从 route.put 将新数据插入到现有文档中,同时在进行任何更改时保持更新当前字段的逻辑。

因此,在用户进行一些更改并更新三个字段后,文档将如下所示,除了 id 处理获取当前登录用户当时和日期/时间并将其传递的逻辑,但对于下面的示例我将对其进行硬编码。:

{
 value: 'Google',
  url: 'https://google.com',
  env: 'Test',
  updatedBy: "Test User"
  timeUpdated: "12:54",
  dateUpdated: "7/25/2018"
 }

所以最终我想保留更改日志,然后将其添加到 UI。

【问题讨论】:

    标签: node.js mongodb express


    【解决方案1】:

    因此,在这篇文章TypeError: callback.apply is not a function (Node.js & Mongodb) 的帮助下,我能够使用 $set 将新字段附加到现有文档中。但是,当尝试在 $set 之前执行 req.body.application 时,它会抛出一个错误,指出 callback.apply 不是一个函数。因此,如果您要在设置新字段后更新文档,我只是创建了一个回调。我知道它很乱,但只是想让它正常工作,你可以随意使用和清理代码。

        router.put("/:id", (req, res) => {
          let value = req.body.value;
      let value = req.body.value;
      let date = new Date();
      let hour = date.getHours();
      hour = (hour < 10 ? "0" : "") + hour;
      let min = date.getMinutes();
      min = (min < 10 ? "0" : "") + min;
      let time = hour+":"+min;
      let year = date.getFullYear();
      let month = date.getMonth() + 1;
      month = (month < 10 ? "0" : "") + month;
      let day  = date.getDate();
      day = (day < 10 ? "0" : "") + day;
      today = month+"/"+day+"/"+year;
      let updatedTo = month+"/"+day+"/"+year;
      let updatedT = hour+":"+min;
      let updatedBy = req.user.username;
        //Find the document based on it's ID and than append these three new fields
            Application.findByIdAndUpdate(req.params.id,
            { $set: { 
                   updatedTime: `${updatedT}`,
                   updatedToday: `${updatedTo}`,
                   updatedBy: `${updatedBy}`
            }}, { upsert: true },
              (err,updatedApp) => {
              if(err){
                return handleError(err);
              } else {
             // Than if any changes were made from the UI we apply those updates taken 
             // from the form with req.body.application
              Application.findByIdAndUpdate(req.params.id, req.body.application,
              (err, updatedApp) => {
              if(err){
               return handleError(err);
              } else {
                console.log(updatedApp)
                req.flash("info", updatedApp.value  + " " + "successfully edited!");
                res.redirect("/qa-hub/applicationmanager");
               }
            }
          });
       });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-14
      • 2020-07-04
      • 1970-01-01
      • 2020-09-13
      • 2021-03-02
      相关资源
      最近更新 更多