Javascript 在使用passport注册后向数组中添加表示用户的对象
我正在尝试创建一个用户名和密码列表,这样当用户使用其凭据登录时,他们可以看到其他人看到的所有数据,但他们仍然必须使用自己的凭据。我想创建一个类似以下对象的列表:[{username:“user1”,password:“pass1”},{username:“user2”,password:“pass2”}]。这应该在注册时创建。我想我会帮上忙,但我没有得到我想要的。我有这个:Javascript 在使用passport注册后向数组中添加表示用户的对象,javascript,arrays,login,mongoose,passport.js,Javascript,Arrays,Login,Mongoose,Passport.js,我正在尝试创建一个用户名和密码列表,这样当用户使用其凭据登录时,他们可以看到其他人看到的所有数据,但他们仍然必须使用自己的凭据。我想创建一个类似以下对象的列表:[{username:“user1”,password:“pass1”},{username:“user2”,password:“pass2”}]。这应该在注册时创建。我想我会帮上忙,但我没有得到我想要的。我有这个: var userlist = new mongoose.Schema({username: String, passwor
var userlist = new mongoose.Schema({username: String, password : String })
var userSchema = new mongoose.Schema({
users : [userlist]
})
我尝试将新用户添加到阵列中,如下所示:
app.post("/signup", function(req, res){
var user = new User;
user.users.push({username : req.body.username, password : req.body.password})
user.save(function(err){
if(err) return handleError(err);
console.log("success")
})
// User.create(users : [{username : req.body.username, password : req.body.password}], function(err, doc){
// console.log(doc);
// })
res.redirect("/login")
})
这是我的
> db.users.find().pretty()
{
"_id" : ObjectId("56ba6219763de71c03199a70"),
"users" : [
{
"username" : "user1",
"password" : "pass1",
"_id" : ObjectId("56ba6219763de71c03199a71")
}
],
"__v" : 0
}
{
"_id" : ObjectId("56ba6225763de71c03199a72"),
"users" : [
{
"username" : "user2",
"password" : "pass2",
"_id" : ObjectId("56ba6225763de71c03199a73")
}
],
"__v" : 0
}
>
它正在制作单独的文件。我希望它看起来像这样
{
"_id" : ObjectId("56ba6219763de71c03199a70"),
"users" : [
{
"username" : "user1",
"password" : "pass1",
"_id" : ObjectId("56ba6219763de71c03199a71")
},
{
"username" : "user2",
"password" : "pass2",
"_id" : ObjectId("56ba6225763de71c03199a73")
}
],
"__v" : 0
}
在子文档中包含objectid对我来说并不重要。我只想将所有用户分组,这样当他们登录时,我可以做一些事情,例如,如果文档在那里,凭据良好,那么继续访问网站的其他部分。我不确定您现在是否已经解决了您的问题,不管您的问题的答案是什么 首先,如果在
子文档
中不需要\u id
,则在架构
中相应地声明,并且不会创建\u id
var userSchema = new Schema({ username: String, password: String},{ _id: false });
如果对用户使用上述模式
,则子文档
中不应有\u id
字段
您应该知道,要插入子文档
,您需要知道它的父文档
。如果插入子文档时未提供父文档
,则每次插入都会创建一个新的pa
租金。在这种情况下,父文档包含\u id
和用户
子文档。如果我有确切的问题,我会用以下方法解决:
模式设计保持如下所示(为了避免混淆,我对它们进行了不同的命名):
现在,我将声明父模型,如下所示:
var UserList = mongoose.model('UserList', userListSchema);
//see below what list gets assigned.
var list;
> db.userlists.find().pretty();
{
"_id" : ObjectId("56c349d6479f5b9b1eaea1c8"),
"users" : [
{
"password" : "pass1",
"username" : "user1"
}
],
"__v" : 0
}
{
"_id" : ObjectId("56c349d6479f5b9b1eaea1c8"),
"users" : [
{
"password" : "pass1",
"username" : "user1"
},
{
"password" : "pass2",
"username" : "user2"
}
],
"__v" : 1
}
{
"_id" : ObjectId("56c349d6479f5b9b1eaea1c8"),
"users" : [
{
"password" : "pass1",
"username" : "user1"
},
{
"password" : "pass2",
"username" : "user2"
},
{
"password" : "pass7",
"username" : "user7"
}
],
"__v" : 2
}
现在让我们假设我有一个路由处理程序,我希望在注册时继续添加用户,如下所示:
app.get("/newuser/:username/:password", function(req, res) {
//create user model
var User = mongoose.model('User', userSchema);
//load user module, for testing i use params, you can change this to req.body
var user = new User({username: req.params.username, password: req.params.password});
//I would like to find the first document in userlists collection
UserList.findOne({}, function(err, result) {
if(err) console.log(err);
//below if condition is true, if there is one document with users subdoc
if(result) {
console.log('Found existing document with users subdocument. Adding user to array.')
//assign the parent where the subdoc should be inserted to list
list = result;
//there already is a document with subdocument users, so append to it
list.users.push(user);
//save the changed list.
list.save(function(err) {
if (err) console.log(err);
console.log('User saved.');
});
} else {
console.log('No document found. Creating one and adding this user to users subdocument.');
// initialize list model with first ever user
list = new UserList({ users: [user] });
//save the new changed list
list.save(function(err) {
if (err) console.log(err);
console.log('User saved.');
});
}
})
});
http://127.0.0.1:8080/newuser/user2/pass2
完成了。现在,当我第一次运行应用程序并访问以下URL时
http://127.0.0.1:8080/newuser/user1/pass1
userslist
集合如下所示:
var UserList = mongoose.model('UserList', userListSchema);
//see below what list gets assigned.
var list;
> db.userlists.find().pretty();
{
"_id" : ObjectId("56c349d6479f5b9b1eaea1c8"),
"users" : [
{
"password" : "pass1",
"username" : "user1"
}
],
"__v" : 0
}
{
"_id" : ObjectId("56c349d6479f5b9b1eaea1c8"),
"users" : [
{
"password" : "pass1",
"username" : "user1"
},
{
"password" : "pass2",
"username" : "user2"
}
],
"__v" : 1
}
{
"_id" : ObjectId("56c349d6479f5b9b1eaea1c8"),
"users" : [
{
"password" : "pass1",
"username" : "user1"
},
{
"password" : "pass2",
"username" : "user2"
},
{
"password" : "pass7",
"username" : "user7"
}
],
"__v" : 2
}
我想使用不同的参数访问链接,如下所示:
app.get("/newuser/:username/:password", function(req, res) {
//create user model
var User = mongoose.model('User', userSchema);
//load user module, for testing i use params, you can change this to req.body
var user = new User({username: req.params.username, password: req.params.password});
//I would like to find the first document in userlists collection
UserList.findOne({}, function(err, result) {
if(err) console.log(err);
//below if condition is true, if there is one document with users subdoc
if(result) {
console.log('Found existing document with users subdocument. Adding user to array.')
//assign the parent where the subdoc should be inserted to list
list = result;
//there already is a document with subdocument users, so append to it
list.users.push(user);
//save the changed list.
list.save(function(err) {
if (err) console.log(err);
console.log('User saved.');
});
} else {
console.log('No document found. Creating one and adding this user to users subdocument.');
// initialize list model with first ever user
list = new UserList({ users: [user] });
//save the new changed list
list.save(function(err) {
if (err) console.log(err);
console.log('User saved.');
});
}
})
});
http://127.0.0.1:8080/newuser/user2/pass2
集合的输出如下所示:
var UserList = mongoose.model('UserList', userListSchema);
//see below what list gets assigned.
var list;
> db.userlists.find().pretty();
{
"_id" : ObjectId("56c349d6479f5b9b1eaea1c8"),
"users" : [
{
"password" : "pass1",
"username" : "user1"
}
],
"__v" : 0
}
{
"_id" : ObjectId("56c349d6479f5b9b1eaea1c8"),
"users" : [
{
"password" : "pass1",
"username" : "user1"
},
{
"password" : "pass2",
"username" : "user2"
}
],
"__v" : 1
}
{
"_id" : ObjectId("56c349d6479f5b9b1eaea1c8"),
"users" : [
{
"password" : "pass1",
"username" : "user1"
},
{
"password" : "pass2",
"username" : "user2"
},
{
"password" : "pass7",
"username" : "user7"
}
],
"__v" : 2
}
现在我终止应用程序,然后重新运行应用程序并访问以下url:
http://127.0.0.1:8080/newuser/user7/pass7
集合的输出如下所示:
var UserList = mongoose.model('UserList', userListSchema);
//see below what list gets assigned.
var list;
> db.userlists.find().pretty();
{
"_id" : ObjectId("56c349d6479f5b9b1eaea1c8"),
"users" : [
{
"password" : "pass1",
"username" : "user1"
}
],
"__v" : 0
}
{
"_id" : ObjectId("56c349d6479f5b9b1eaea1c8"),
"users" : [
{
"password" : "pass1",
"username" : "user1"
},
{
"password" : "pass2",
"username" : "user2"
}
],
"__v" : 1
}
{
"_id" : ObjectId("56c349d6479f5b9b1eaea1c8"),
"users" : [
{
"password" : "pass1",
"username" : "user1"
},
{
"password" : "pass2",
"username" : "user2"
},
{
"password" : "pass7",
"username" : "user7"
}
],
"__v" : 2
}
好了。看到userlists
collection总是有一个document
,并且它的数组会不断扩展,我感到很遗憾,也许用这种方式解决问题不是一个好的做法。如果我是您,我会将每个用户存储为单个记录
,然后执行分组方式或任何其他聚合
操作