首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我正在尝试用Expess.js提交一个表单,但是我遇到了一个错误

我正在尝试用Expess.js提交一个表单,但是我遇到了一个错误
EN

Stack Overflow用户
提问于 2018-05-15 10:31:17
回答 1查看 73关注 0票数 0
代码语言:javascript
复制
exports.campagne_add_post = function(req, res, next) {

    // Validate fields.
    req.assert('name', 'Please fill the name').isLength({ min: 1 }).trim().withMessage('First name must be specified.')
        .isAlphanumeric().withMessage('First name has non-alphanumeric characters.');
    req.assert('date_debut', 'Invalid date_debut').isISO8601();
    req.assert('date_fin', 'Invalid date_fin').isISO8601();
    req.assert('agence', 'Please fill agence name').isLength({ min: 1 }).trim().withMessage('Agence must be specified.')
        .isAlphanumeric().withMessage('Agence has non-alphanumeric characters.');
    req.assert('annonceur', 'Please fill the annonceur name').isLength({ min: 1 }).trim().withMessage('Annonceur name must be specified.')
        .isAlphanumeric().withMessage('Annonceur name has non-alphanumeric characters.');
    req.assert('groupe_annonceur', 'Please fill groupe annonceur').isLength({ min: 1 }).trim().withMessage('Groupe annonceur must be specified.')
        .isAlphanumeric().withMessage('Groupe annonceur has non-alphanumeric characters.');
    req.assert('produit', 'Please fill product name').isLength({ min: 1 }).trim().withMessage('Poduct name must be specified.')
        .isAlphanumeric().withMessage('Product name has non-alphanumeric characters.');

    var errors = req.validationErrors();
    console.log(errors);
    if (!errors) {

        // Sanitize fields (using wildcard).
        sanitizeBody('*').trim().escape();

        var campagne = new Campagne(
            {
                name: req.body.name,
                date_debut: req.body.date_debut,
                date_fin: req.body.date_fin,
                agence: req.body.agence,
                annonceur: req.body.annonceur,
                groupe_annonceur: req.body.groupe_annonceur,
                produit:   req.body.produit


            }
        );


        Campagne.findOne({ 'name': req.body.name })
            .exec(function (err, found_name) {
                if (err) {
                    var errors_detail = ("Error Insert : %s ", err);
                    req.flash('msg_error', errors_detail);
                    res.render('campagne/add-campagne',
                        {
                            name: req.body.name,
                            date_debut: req.body.date_debut,
                            date_fin: req.body.date_fin,
                            agence: req.body.agence,
                            annonceur: req.body.annonceur,
                            groupe_annonceur: req.body.groupe_annonceur,
                            produit:   req.body.produit,
                        });
                }
                if (found_name) {
                    req.flash('msg_error', 'Campagne with the same name already existe');
                    res.render('campagne/add-campagne',
                        {
                            name: req.body.name,
                            date_debut: req.body.date_debut,
                            date_fin: req.body.date_fin,
                            agence: req.body.agence,
                            annonceur: req.body.annonceur,
                            groupe_annonceur: req.body.groupe_annonceur,
                            produit:   req.body.produit,
                        });
                }
                else {
                    if(req.body.date_debut > req.body.date_fin){
                        req.flash('msg_error', 'date_debut must be before date_fin');
                        res.render('campagne/add-campagne',
                            {
                                name: req.body.name,
                                date_debut: req.body.date_debut,
                                date_fin: req.body.date_fin,
                                agence: req.body.agence,
                                annonceur: req.body.annonceur,
                                groupe_annonceur: req.body.groupe_annonceur,
                                produit:   req.body.produit
                            });
                    }else {

                            console.log(req.body.name +'\n');
                            console.log(req.body.date_debut +'\n');
                            console.log(req.body.date_fin +'\n');
                            console.log(req.body.agence +'\n');
                            console.log(req.body.annonceur +'\n');
                            console.log(req.body.produit);
                        campagne.save(function (err) {
                            if (err) {
                                var errors_detail = ("Error Insert : %s ", err);
                                req.flash('msg_error', errors_detail);
                                res.render('campagne/add-campage',
                                    {
                                        name: req.body.name,
                                        date_debut: req.body.date_debut,
                                        date_fin: req.body.date_fin,
                                        agence: req.body.agence,
                                        annonceur: req.body.annonceur,
                                        groupe_annonceur: req.body.groupe_annonceur,
                                        produit:   req.body.produit
                                    });
                            }

                            // Genre saved. Redirect to genre detail page.
                            req.flash('msg_info', 'Create campagne success');
                            res.redirect('/campagnes');

                        });
                    }
                }
            });
    } else {
        console.log(errors);
        errors_detail = "Sory there are error" + " <ul>" ;
        for (i in errors)
        {
            error = errors[i];
            errors_detail += ' <li>'+error.msg+'</li>';
        }
        errors_detail += "</ul>";
        req.flash('msg_error', errors_detail);
        res.render('campagne/add-campagne',
            {
                name: req.body.name,
                date_debut: req.body.date_debut,
                date_fin: req.body.date_fin,
                agence: req.body.agence,
                annonceur: req.body.annonceur,
                groupe_annonceur: req.body.groupe_annonceur,
                produit:   req.body.produit,
            });
    }
};

当我提交表单时,我会收到这样的消息:错误:无法在发送后设置标头。validateHeader (_http_outgoing.js:494:11) at ServerResponse.setHeader (_http_outgoing.js:501:3)

我看到错误的原因之一是控制器中的重定向。我也有一个$__save.error在猫鼬。如果我能得到一些帮助,那就太好了。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-05-15 10:43:35

因为无论何时调用res.render都不会返回。这样,您将尝试多次发送响应,因此,在发送第一个响应后设置标头。

例如:

代码语言:javascript
复制
Campagne.findOne({ 'name': req.body.name })
   .exec(function (err, found_name) {
      if (err) {
          var errors_detail = ("Error Insert : %s ", err);
          req.flash('msg_error', errors_detail);
          // you should return here, because it can go to following condition
          return res.render('campagne/add-campagne',{ 
             // some code
          }); 
      }

      if (found_name) {
          req.flash('msg_error', 'Campagne with the same name already existe');
          return res.render('campagne/add-campagne', {
              // some code 
          });
      }

在任何情况下都要做。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50347997

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档