如何使用快递形式在验证错误后重新填充表单字段?

k00*_*00k 5 validation node.js express

使用node.js并使用express-express表达(2.5.9).

我应该如何使用提交的值重新填充表单字段?

我有get一条post路线.如果在发布表单时存在验证错误,我将用户重定向回get,问题是重新填充的本地人没有显示(我确实有autoLocals:true,所以我认为是因为我重定向并且res是重启.)

那么你们如何重新填充以及你们的申请流程是什么,你们是否res.send代替res.redirect并重新设置整个事物?这似乎是重复的.

这是我的帖子路线的一个例子:

app.post(

  '/projects/:id'

  , form(field("title").required("title", "Title is required)
  , function (req, res){

  if (!req.form.isValid){
    res.redirect('/project/'+req.params.id+'/edit');
  }
  else{
    // save to db
  }

});
Run Code Online (Sandbox Code Playgroud)

Kin*_*mah 6

我正在使用expressjs4.0在验证后重新填充表单字段:

router.route('/posts/new')
 .get(function(req, res) {
 res.render('posts/new', new Post({}));
});
Run Code Online (Sandbox Code Playgroud)

下面res.render中的第二个参数将在视图中设置一些变量.

res.render('posts/new', new Post({}));
Run Code Online (Sandbox Code Playgroud)

在我看来,然后我将表单字段设置如下:

...
<input type="text" name="title" value="<%- post.title %>">
<textarea name="article"><%- post.article %></textarea>
...
Run Code Online (Sandbox Code Playgroud)

当您提交此表单时,它应该被您的路由器捕获,如下所示:

router.route('/posts')
  .post(function(req, res) {
    var post = new Post(req.body)
      post.save(function(err) {
       if (err) {
         res.locals.errors = err.errors;
         res.locals.post = post;
         return res.render('posts/new');
       }
      return res.redirect('/posts');
  });
  ...
})
Run Code Online (Sandbox Code Playgroud)

这行代码重置了视图中的表单字段

res.locals.post = post;
Run Code Online (Sandbox Code Playgroud)

我希望有人觉得这很有用;)


Pau*_*aul 2

不确定这是否是最佳实践,但是当我验证失败时,我不会重定向,而是重新渲染视图(通常通过将控制传递给“get”回调)。像这样的东西:

function loadProject(req,res, id){ /* fetch or create logic, storing as req.model or req.project */} 

function editProject(req,res){ /* render logic */ }

function saveProject(req,res){ 
    if(!req.form.isValid){ 
        editProject(req,res);
    }else{
        saveToDb(req.project);
        res.redirect('/project'+req.project.id+'/edit');
    }
}

app.param('id', loadProject);
app.get('/projects/:id/edit', editProject);
app.post('/projects/:id', saveProject);
Run Code Online (Sandbox Code Playgroud)