Javascript 从mongoDB检索用户数据

Javascript 从mongoDB检索用户数据,javascript,mongodb,mongoose,Javascript,Mongodb,Mongoose,我正在构建一个应用程序,用户可以登录并在其帐户上创建一个购物清单(他们可以做更多的事情,比如创建食谱,但这就是我想要使用的示例)。现在我有了它,所以每个登录的人都会看到相同的列表。但我希望每个用户都能够登录并查看他们自己制作的购物清单。我假设这种逻辑实际上就像登录社交媒体网站查看你的个人资料,而不是其他人的 我正在使用mongoDB/mongoose,我刚刚了解了填充方法以及当前模式中的其他模式。以下是我的列表模式: const mongoose = require('mongoose'); c

我正在构建一个应用程序,用户可以登录并在其帐户上创建一个购物清单(他们可以做更多的事情,比如创建食谱,但这就是我想要使用的示例)。现在我有了它,所以每个登录的人都会看到相同的列表。但我希望每个用户都能够登录并查看他们自己制作的购物清单。我假设这种逻辑实际上就像登录社交媒体网站查看你的个人资料,而不是其他人的

我正在使用mongoDB/mongoose,我刚刚了解了填充方法以及当前模式中的其他模式。以下是我的列表模式:

const mongoose = require('mongoose');
const Schema = mongoose.Schema;

// Create item schema
const GroceryListItemSchema = new Schema({
  item: {
    type: String,
    required: [true, 'Item field is required']
  },
  userId: {
    type: mongoose.Schema.Types.ObjectId, ref: "user",
  }
});


// Create an Item model
const GroceryListItem = mongoose.model('groceryListItem', GroceryListItemSchema);
module.exports = GroceryListItem;
下面是添加列表项的post请求:

//POST request for shopping list
router.post("/list", checkToken, (req, res, next) => {
  // Add an item to the database
  const groceryListItem = new GroceryListItem({
    item: req.body.item,
    userId: ???
  })

  groceryListItem.save()
    .then((groceryListItem) => {
      res.send(groceryListItem);
    })
    .catch(next);
});
这是我的用户模型-不确定是否有必要显示:

const mongoose = require("mongoose");
const Schema = mongoose.Schema;

const UserSchema = new Schema({
  username: {
    type: String,
    required: true,
  },
  email: {
    type: String,
    required: true,
  },
  password: {
    type: String,
    required: true,
  },
  password2: {
    type: String,
    required: true,
  },

});

const User = mongoose.model("users", UserSchema);
module.exports = User;
(如果有人想知道为什么这个模型被称为“用户”——这就是我最初在《意外》中对它的称呼,当我把它的名字改为“用户”时,它就错了……所以我把它改了回去。)

我不知道在创建
groceryListItem
实例时如何添加
userId
。在mongoose文档()中,他们使用了故事和人物模式的示例。它们相互引用,然后创建Person的实例,称之为author。然后他们从作者那里获取_id,并在他们的故事实例中引用它,称为故事1。这对我来说很有意义。但他们能做到这一点的唯一方法是因为author和story1位于同一个文件中

因此,我应该做的似乎是通过说
userId:users.\u id
来获取用户id。但是我的
新用户
实例在我的用户路径中。我不想把两者结合起来。因为那样的话,我也会有另一个列表要合并,这将是我的用户路线,食谱路线,和购物清单路线都在一个文件中,这将是非常混乱的

有人知道我该怎么做吗?这看起来很简单,但出于某种原因我无法理解

谢谢

编辑-前端API调用:

handleSubmitItem = (e) => {
    e.preventDefault();
    const newItem = {
      item: this.state.userInput,
    };

    authAxios
      .post(`http://localhost:4000/list/${userId}`, newItem)
      .then((res) => {
        this.setState({ items: [...this.state.items, newItem] });
        newItem._id = res.data._id;
      })
      .catch((err) => console.log(err));

    this.setState({ userInput: "" });
  };

在这里,您只需在POST请求参数中传入用户ID。前端的帖子URL应该是这样的;{
localhost:9000/like/${userID}
}

您可以像这样在express后端获取用户ID

router.post("/list/:id", checkToken, (req, res, next) => {
// Add an item to the database
const groceryListItem = new GroceryListItem({
    item: req.body.item,
    userId: req.params.id
})

groceryListItem.save()
    .then((groceryListItem) => {
        res.send(groceryListItem);
    }).catch(next);

}))

谢谢!!我试过了,这很有道理。但是我在前端收到一个错误,说无法定义userId(从localhost/list/${userId})。当我定义列表项时,这是我需要定义的吗?如:const newItem={item:this.state.userInput,userId:???};或者我需要把它作为一个论点传递到某个地方?如果是,我不确定在哪里。是的,它需要作为参数传递给进行api调用的函数。如果我能看到你的前端api调用,我可以更好地向你解释,只是把它添加到我的帖子的底部<代码>常量userId=“5ebb0a16ad9d0b25108a0384”,这是登录用户的ID。是否有方法设置用户ID而不进行硬编码?