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