【问题标题】:How to access same post from one controller to another?如何从一个控制器访问相同的帖子到另一个?
【发布时间】:2017-12-29 11:53:00
【问题描述】:

我是全栈 Web 开发的新手。现在我遇到了一个问题。我正在使用 mongodb、mongoose、node 和 express。

我有两个控制器,一个是注册,另一个是配置文件。

注册码是这样的

router.post('/',(req,res,next)=>{

    let user = new userProfile();
    user.email = req.body.email;
    user.name = req.body.firstName;

    user.save((err)=>{
        if(err){
            return err;
        }
    })
    res.redirect('/profile');
});

点击提交后,我可以在集合中找到用户条目。现在我在配置文件控制器。

个人资料代码:

router.get('/',(req,res)=>{
    console.log(req.body.email);
    userProfile.find({email: 'yyyy'},(err,user)=>{
        if(err) return err;

    })
    res.render('profile/profile');  
})

当我执行 console.log 时,它输出未定义。预期的输出应该是注册页面的电子邮件地址,这样当我找到功能时,我会得到具有相同电子邮件地址的正确条目并在网页上显示相应的用户名。

我的问题是配置文件控制器如何从注册控制器访问相同的帖子信息。

【问题讨论】:

  • req 对象仅限于“当前请求”,这意味着如果您实际上没有在该请求的“正文”中发送任何内容,那么那里什么都没有。无论如何,您实际上并不使用 GET 请求中的“正文”。相反,您可以在 url 中发送数据并在请求中匹配为router.get('/:email',(req,res) => { userProfile.findOne({ "email": req.params.email },...,或者实际上您宁愿使用“会话”并通过它检索当前经过身份验证的用户。或许将passport 视为集成身份验证的一种方式。
  • 听起来你需要在服务器上建立一个用户会话,所以一旦用户在第一个请求上登录,当第二个请求进来时,你就可以知道它是哪个用户。 http 服务器基本上是无状态的,因此您不会直接从另一个请求中的一个请求访问数据,因为当第二个请求到达时,第一个请求早已消失。相反,您可以对用户进行 cookie,然后可以使用实现会话对象的代码来存储该特定用户的半永久性数据,这些数据可以在未来的请求中访问。见express-session

标签: javascript node.js mongodb express mongoose


【解决方案1】:

我假设您在 Express 中使用了像 bodyParser 这样的中间件。否则,您使用req.body 的发帖请求将不起作用。

router.get() 请求中,您没有任何正文。您可以使用这样的路线:

http://yourdomain.com/api/profile/test@mail.com 与:

router.get('/profile/:email',(req,res)=>{
    console.log(req.query.email);
    userProfile.find({email: req.query.email},(err,user)=> {
    [...]
}

或带参数:

http://yourdomain.com/api/profile/?email=test@mail.com 与:

router.get('/profile/',(req,res)=>{
    console.log(req.params.email);
    userProfile.find({email: req.params.email},(err,user)=> {
    [...]
}

【讨论】:

    【解决方案2】:

    您正在寻找的称为 Express 中间件。

    这里有一篇很棒的文章,用大量的应用程序级中间件示例进行了深入的解释,并且 路由器级别。

    在您的情况下,您的 Express 路由配置应如下所示,

    // Controller containing your router.get (signup) and router.post (show profile) code
    var core = require('../controllers/core.controller');
    
    app.route('/signup')
      .post(core.signup, core.showProfile)
    

    您可以看到我们已将POST /signup 路径委托给首先调用 core.signup,然后调用 core.showProfile(仅当调用 next() 时)。

    您在原始帖子中包含的两个端点处理程序现在将类似于以下内容,

    export.signup = (req,res) => {
        let user = new userProfile();
        user.email = req.body.email;
        user.name = req.body.firstName;
    
        user.save((err)=>{
            if(err){
                return err;
            }
        })
        next();
    });
    
    export.showProfile = (req,res ) => {
        console.log(req.body.email);
        userProfile.find({email: 'yyyy'},(err,user)=>{
            if(err) return err;
    
        })
        res.render('profile/profile');  
    })
    

    这些将存在于您在应用程序路径中导入的任何文件中,例如,我从路径 ../controllers/core.controller 导入。

    【讨论】:

      猜你喜欢
      • 2017-03-23
      • 1970-01-01
      • 2018-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-30
      • 2014-06-06
      • 2015-10-31
      相关资源
      最近更新 更多