1

我只是在学习 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'). 但我似乎一直遇到范围问题。

4

1 回答 1

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.
    });
});

The syntax :userId in the uri indicates a path variable named userId which will be available in req.params.

But if you're writing a regular web application, I would recommend the first approach using the session middleware.

于 2013-03-31T00:10:40.513 回答