无法通过Mongoose保存的快递访问POST调用中的数据

时间:2013-03-30 23:58:11

标签: node.js mongodb express mongoose

我正在学习Node,Mongoose和Express。我看了整个stackoverflow,否则在哪里,我仍然无法找到我的问题的答案。

我很确定这只是一个非常初学的错误。当我在app.post中保存发布的数据时,我无法在我的node / express代码中的任何其他位置访问它。我收到错误“ReferenceError:getUsersInfo未定义”。

var mongoose = require('mongoose');
mongoose = mongoose.createConnection('localhost', '27017');
mongoose.on('error', console.error.bind(console, 'connection error:'));
var Schema = mongoose.Schema
  , ObjectId = Schema.ObjectID;

var usersSchema = new Schema({
    username: String,
    password: String, 
    email: String,
    date_created:{ type: Date, default: Date.now }
});

var users = mongoose.model('users', usersSchema);

app.get('/', function(req,res){
  res.render('layout.jade', { 
      title : "Hello!"
    ,analytics: 'XXXXXX'
  });
});

app.post('/', function(req, res){   
    var getUsersInfo = new users({
        username: req.body.user,
        password: req.body.password,
        email: req.body.email,
    });

    getUsersInfo.save(function (err, getUsersInfo) {
        if (err){throw err;}
        console.log(getUsersInfo.username);
        res.redirect("/success");
    });
});

app.get('/success', function(req, res){
    res.render('loggedin.jade', {
        title : "Admin Panel",
        analytics: 'XXXXXX'
    });

    var username = getUsersInfo("username");
    res.write("<h1> hi, " + username + "</h1>");

});

您可以给我任何帮助,例如要查看的地方或更好的方式来编写我的代码,我们将不胜感激。我尝试从过时的教程中学习并且没有得到任何地方,而且mongoose api / docs似乎没有涵盖这个东西。

谢谢!

编辑
为了澄清我在这里想要实现的目标,我想获取表单输入(在layout.jade文件中呈现)并将它们保存到数据库(我在app.post中进行)。我希望能够在代码中的其他位置访问这些数据库对象,而不仅仅是app.get('/success')。但似乎我一直遇到范围问题。

1 个答案:

答案 0 :(得分:0)

在nodejs / expressjs应用程序中,您的路由(app.getapp.post等)设置了回调函数,当用户请求相应的URL时将调用这些函数。需要在这些回调中调用应在请求中完成的所有操作。在您的示例中,您尝试在getUsersInfo中设置的回调之外访问app.post。如果你在回调中移动代码,它应该会让你更进一步:

app.post('/', function(req, res) {
    var getUsersInfo = new users({
        username: req.body.user,
        password: req.body.password,
        email: req.body-email
    });
    getUsersInfo.save(function(err, userinfo) {
        if(!err) {
            res.redirect('/success');
        }
        else {
            // Send error
        }
    });
});

编辑:上面的答案因代码缩进而混淆,现在应予以纠正。看起来您正在制作常规网络应用,因此我建议您查看session中间件。一个简单的入门方法是使用命令express --sessions myapplication生成您的快速应用程序。这将设置您的应用程序,以便您有一个req.session对象,您可以在其中放置会话范围的对象:

app.post('/', function(req, res) {
   var getUsersInfo = new users({
        username: req.body.user,
        password: req.body.password,
        email: req.body-email
    });
    getUsersInfo.save(function(err, userinfo) {
        if(!err) {
            req.session.user = userInfo;
            res.redirect('/success');
        }
        else {
            // Send error
        }
    });
});

然后在app.get

app.get('/success', function(req, res) {
    var user = req.session.user;
    // Do what you want with the user
});

如果您使用的是REST方法,则保存然后检索资源时的典型模式是使用GET重定向到获取已创建资源的URL,并包含资源的标识符。在这种情况下,您的重定向将如下所示

res.redirect('/success/' + userInfo.id)

你可以这样做一条路线:

app.get('/success/:userId', function(req, res) {
    var user_id = req.param('userId');
    users.findById(user_id, function(err, user) {
        // user is available here. Add it to the template context and render it.
    });
});

uri中的语法:userId表示名为userId的路径变量,该变量将在req.params中提供。

但是如果您正在编写常规Web应用程序,我建议使用会话中间件的第一种方法。