在使用 Passport 注册后将表示用户的对象添加到数组中

adding an object that represents users to an array after signup using passport

本文关键字:对象 添加 数组 用户 表示 Passport 注册      更新时间:2023-09-26

我正在尝试列出用户名和密码,以便当用户使用其凭据登录时,他们可以看到其他人看到的所有数据,但他们仍然必须使用自己的凭据。我想列出这样的对象列表users : [{username : "user1", password : "pass1"}, {username : "user2", password : "pass2"}].这应该在注册时创建。我虽然子文档会有所帮助,但我没有得到我想要的。我有这个:

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
}

在子文档中拥有对象ID对我来说并不那么重要。我只想将所有用户分组在一起,以便当他们登录时,我可以做一些事情,例如如果文档在那里,凭据很好,所以继续到网站的其他部分。

我不确定你现在是否已经解决了你的问题,不管这里是你问题的答案。

首先,如果您不需要_id subdocument则相应地在schema中声明,并且不会创建任何_id

var userSchema = new Schema({ username: String, password: String},{ _id: false }); 

如果您使用上述schema进行usersubdocument中应该没有_id字段。

您应该知道,要插入subdocument您需要知道它的parent。如果您在插入subdocument时没有提供parent,则每次插入都会创建一个新的 p a租金。在这种情况下,父文档包含_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
}

现在,我终止应用程序,然后重新运行应用程序并访问以下 url:

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然后执行分组依据或任何其他aggregation操作。