使用护照注册后将代表用户的对象添加到数组中
Posted
技术标签:
【中文标题】使用护照注册后将代表用户的对象添加到数组中【英文标题】:adding an object that represents users to an array after signup using passport 【发布时间】:2016-05-19 22:12:08 【问题描述】:我正在尝试制作一个用户名和密码列表,以便当用户使用他们的凭据登录时,他们可以看到其他人看到的所有数据,但他们仍然必须使用自己的凭据。我想制作一个像users : [username : "user1", password : "pass1", username : "user2", password : "pass2"]
这样的对象列表。这应该在注册时创建。我虽然subdocs 会有所帮助,但我没有得到我想要的。我有这个:
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 对我来说并不重要。我只想将所有用户分组在一起,这样当他们登录时,我可以做一些事情,比如如果文档在那里,凭据是好的,所以继续访问网站的其他部分。
【问题讨论】:
【参考方案1】:我不确定您现在是否已经解决了您的问题,不管这里是您问题的答案。
首先,如果您在subdocument
中不需要_id
,则相应地在schema
中声明,并且不会创建_id
。
var userSchema = new Schema( username: String, password: String, _id: false );
如果您将上述schema
用于user
,则subdocument
中不应有_id
字段。
您应该知道要插入subdocument
,您需要知道parent
。如果您在插入 subdocument
时未提供 parent
,则为每个插入创建一个新的 pa
rent。在这种情况下,父文档包含 _id
和 users
子文档。如果我有确切的问题,我会通过以下方式解决它:
架构设计保持不变,如下所示(为了避免混淆,我对它们进行了不同的命名):
var userSchema = new Schema(username: String, password: String, _id : false );
var userListSchema = new Schema(
users: [userSchema]
);
现在我将父模型声明如下:
var UserList = mongoose.model('UserList', userListSchema);
//see below what list gets assigned.
var list;
现在假设我有一个路由处理程序,我想在注册时继续添加用户,如下所示:
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.');
);
)
);
完成。现在,当我第一次运行应用程序并访问以下 URL 时
http://127.0.0.1:8080/newuser/user1/pass1
userslist
集合如下所示:
> db.userlists.find().pretty();
"_id" : ObjectId("56c349d6479f5b9b1eaea1c8"),
"users" : [
"password" : "pass1",
"username" : "user1"
],
"__v" : 0
我想使用不同的参数访问链接,如下所示:
http://127.0.0.1:8080/newuser/user2/pass2
集合的输出如下所示:
"_id" : ObjectId("56c349d6479f5b9b1eaea1c8"),
"users" : [
"password" : "pass1",
"username" : "user1"
,
"password" : "pass2",
"username" : "user2"
],
"__v" : 1
现在我终止应用程序,然后重新运行应用程序并访问以下网址:
http://127.0.0.1:8080/newuser/user7/pass7
集合的输出如下所示:
"_id" : ObjectId("56c349d6479f5b9b1eaea1c8"),
"users" : [
"password" : "pass1",
"username" : "user1"
,
"password" : "pass2",
"username" : "user2"
,
"password" : "pass7",
"username" : "user7"
],
"__v" : 2
给你。我很难过看到 userlists
集合总是有一个 document
并且它的数组会不断扩大,以这种方式解决你的问题可能不是一个好习惯。如果我是你,我会将每个用户存储为单个 record
,然后执行 group by 或任何其他 aggregation
操作。
【讨论】:
以上是关于使用护照注册后将代表用户的对象添加到数组中的主要内容,如果未能解决你的问题,请参考以下文章
Mongoose“创建”方法 - 没有回调吗? (使用护照和角度)