【问题标题】:Can't access data from a POST call by express saved by Mongoose无法通过 Mongoose 保存的快递访问 POST 调用中的数据
【发布时间】:2013-03-31 15:45:49
【问题描述】:

我只是在学习 Node、Mongoose 和 Express。我已经查看了 stackoverflow 和其他地方的所有内容,但我仍然找不到我的问题的答案。

我相当肯定这只是一个非常初学者的错误。当我将发布的数据保存在 app.post 中时,我无法在我的节点/快递代码中的其他任何地方访问它。我收到错误“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>");

});

您可以为我提供的任何帮助(例如查看的地方或编写代码的更好方法)将不胜感激。我尝试从过时的教程中学习,但一无所获,猫鼬 api/docs 似乎没有涵盖这件事。

谢谢!

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

【问题讨论】:

    标签: node.js mongodb express mongoose


    【解决方案1】:

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

    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 应用程序,我会推荐使用会话中间件的第一种方法。

    【讨论】:

    • getUsersInfo = new users({}) & getUsersInfo.save 据我所知,始终位于 app.post 内部。感谢您清理我丑陋的.save() 回调,这是一种更好的方法!有没有办法在 app.post 函数之外访问 getUserInfo ?检查我的编辑以进一步澄清!
    • 好吧,我被示例的缩进给骗了。我已经清理了格式并用更多信息更新了我的答案。
    • 首先 - 非常感谢您的帮助,如果可以的话,我一定会给您一些代表。其次,我已经尝试了您提供的代码,我为格式的混乱表示歉意,在崇高的情况下看起来很好,但它转移得很奇怪。这回答了我的一个问题,另一个问题仍然是,如果我抓取表单数据并将其保存到数据库中,我以后如何访问它?不幸的是,我仍然收到`ReferenceError: userInfor is not defined`错误。
    • 要从数据库中获取对象,您必须将标识符传递给将获取实体的路由。然后,您将在 Mongoose 架构上使用 query 来查找对象。很像上面示例中的第二种方法。
    猜你喜欢
    • 2013-08-16
    • 2021-02-14
    • 2021-02-06
    • 2014-10-16
    • 2015-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多