我正在学习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')
。但似乎我一直遇到范围问题。
答案 0 :(得分:0)
在nodejs / expressjs应用程序中,您的路由(app.get
,app.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应用程序,我建议使用会话中间件的第一种方法。