res.redirect不是承诺函数

时间:2018-05-19 15:54:07

标签: node.js express redirect es6-promise

我使用node v8.11.1 with express 4.16.3和postgresql作为我的数据库,所以我使用pg模块。我是新的承诺然后。这是我应该工作的代码

路线

 router.post('/save',
(req, res)=>{
  req.checkBody('email', 'put email').notEmpty().trim();
  let errors = req.validationErrors();
  if (errors) {
    req.session.msgs = errors;
    res.redirect('/signup');
   }
   else {
     var user = {email:req.body.email};
     signup.signup(user)
     .then((res)=>{           
       req.session.msgs = [{msg: res}];
       res.redirect('/events');
       },
       (rej)=>{
         res.redirect('/signup');
         req.session.msgs = [{msg: 'err'}];
       }
     )
     .catch((err)=>{
       res.redirect('/signup');
       req.session.msgs = [{msg: 'err'}];
     });
   }
});

功能

const signup = (user) => {
  return new Promise((res, rej)=>{
    pool.connect( //connect to db
      (err, client, done) => {
        if (err) {
          return rej(err); //rej
        }
        client.query('insert into user (email) values($1)',[user.email]);
        done();
        res(user.email);
      }// pool anonumous funct
    );//pool connect
  })//promise
};
exports.signup = signup;

所以,我想这应该可以立即使用,但我得到err TypeError: res.redirect is not a function指的是我的路线,在这部分

     signup.signup(user)
     .then((res)=>{           
       req.session.msgs = [{msg: res}];
       res.redirect('/events'); // <= REFERS HERE
       },

我错过了什么?为什么这不是一个功能?如何解决这个问题?谢谢

2 个答案:

答案 0 :(得分:2)

您在res回调中使用了then,并且res隐藏了router.post的{​​{1}}。

所以你需要重命名其中一个。

答案 1 :(得分:1)

您在数据库响应中隐藏“res”:

router.post('/save',
(req, res)=>{ // one "res" here!
  req.checkBody('email', 'put email').notEmpty().trim();
  let errors = req.validationErrors();
  if (errors) {
    req.session.msgs = errors;
    res.redirect('/signup');
   }
   else {
     var user = {email:req.body.email};
     signup.signup(user)
     .then((res)=>{  // SHADOWS "res" in here !          
       req.session.msgs = [{msg: res}];
       res.redirect('/events');
       },
       (rej)=>{
         res.redirect('/signup');
         req.session.msgs = [{msg: 'err'}];
       }
     )
     .catch((err)=>{
       res.redirect('/signup');
       req.session.msgs = [{msg: 'err'}];
     });
   }
});