从节点express

时间:2018-12-12 12:26:49

标签: node.js express handlebars.js

我有一个设置有Node / Express后端的html / handlebars表单。该表单提供了从数据库填充的选项。我可以获取返回单个用户选择值的表单并将其保存到我的mongodb中,但是我确实需要整个对象。

{{#each proxyObj}}
            <p>
                <label>
                    <input type="radio" name="proxyTitle" value="{{title}}"/>
                    <span>{{title}}</span>
                </label>
            </p>
            {{/each}}

这是快递:

router.post("/proxies/:id", ensureAuthenticated, (req, res) => {
  Project.findOne({
       _id: req.params.id
    }).then(project => {
    const newProxy = {
        proxyTitle: req.body.proxyTitle
        // I need the other object values to go here, or to be able to retrieve them later
   };
    // Add to proxy array on the Project object in the collection
    project.proxies.push(newProxy);

    project.save().then(project => {
    res.redirect(`/projects/stakeholders/${project.id}`);
    });
  });
});

尝试将整个对象作为值输入到输入字段中,还是返回对象的id并在db中查找,是否更明智?我需要在同一页面上显示一些返回的对象信息,并在以后使用。哪一种效率更高?什么是最好的方法?

1 个答案:

答案 0 :(得分:0)

如果我做对了,问题是您试图在<input type="radio" name="proxyTitle" value="{{title}}"/>的一种表单上放置多个具有相同名称的输入,这会给您类似的信息

<input type="radio" name="proxyTitle" value="Title 1"/>
<input type="radio" name="proxyTitle" value="Title 2"/>
<input type="radio" name="proxyTitle" value="Title 3"/>

here所述,浏览器会对其进行咀嚼,但是服务器端的处理可能需要进行一些调整。

对于您而言,最简单的解决方法是将索引添加到参数名称中。因此,您的表单将如下所示:

{{#each proxyObj}}
    <p>
        <label>
            <input type="radio" name="proxies[{{@key}}]" value="{{this}}"/>
            <span>{{this}}</span>
        </label>
    </p>
{{/each}}    

(请注意,如果proxyObj是一个数组,则必须使用@index而不是@key;此外,根据proxyObj字段的结构,您可能必须使用this.title作为要显示的值,什么都不要。)

对于服务器端处理,您必须循环浏览收到的proxies并逐一处理它们,例如

  router.post("/proxies/:id", ensureAuthenticated, (req, res) => {
    Project.findOne({
      _id: req.params.id
    }).then(project => {
      project.proxies = []; // this is only in case you wanna remove the old ones first
      const proxies = req.body.proxies;
      for(let i = 0;  i < proxies.length; i++) {
        // Add to proxy array on the Project object in the collection
        project.proxies.push({ proxyTitle: proxies[i].title });
      }

      project.save().then(project => {
      res.redirect(`/projects/stakeholders/${project.id}`);
    });
  });
});