如何在页面上显示来自 mongodb 数据库的用户数据,编辑数据并再次保存

Posted

技术标签:

【中文标题】如何在页面上显示来自 mongodb 数据库的用户数据,编辑数据并再次保存【英文标题】:How to show userdata from a mongodb database on a page, edit the data and save again 【发布时间】:2021-12-18 11:51:03 【问题描述】:

我有一个网站,您可以在其中注册为用户并登录。现在我正在尝试创建一个个人资料页面,您可以在其中更改您的用户名、电子邮件和密码。 我只能从数据库中的用户表中获取第一个用户的数据。如何获取当前登录的用户?

在这里我创建一个用户并保存到数据库。这工作正常:

router.post("/users", async (req, res) => 
    const user = new User(req.body)
    try 
        await user.save()
        const token = await user.generateAuthToken()
        console.log(user, token)
        res.status(201).redirect("/")
     catch (e) 
        res.status(400).send(e)
    
)

然后我登录该用户。这也可以按预期工作。

router.post("/users/login", async (req, res) => 
    try 
        const user = await User.findByCredentials(req.body.email, req.body.password)
        const token = await user.generateAuthToken()
        console.log(user, token)
        res.cookie('auth_token', token,  maxAge: 21600000 )
        res.redirect("/frontpage")
     catch (e) 
        res.status(400).send(`<div style="background-color: red; text-align: center"><h1> Wrong credentials - Did you register...?</h1> <a href='/'><h2 style="color: black"> Try again please </h2></a> <a href='/register'><h2 style="color: black"> Register </h2></a><p> $e </p></div>`)
    
)

然后我尝试使用此路由和 AJAX 获取数据。显然,这只会获取数据库中的第一个条目。我用 findById 尝试了不同的方法,但无法检索任何数据。我做错了什么?

router.get("/users/me", async (req, res) => 
    try 
        const user = await User.findOne()

        if (!user) 
            return res.status(404).send()
        
            console.log(user.id, user.name, user.email)
            res.send(user)
         catch (e) 
            res.status(500).send()
    

AJAX 调用:

(async function getProfile() 
    try 
        $.ajax(
            method: "GET",
            url: "/users/me",
            dataType: "json"
        ).done(function (user) 
            $("#addData")
                .append($("<tr>"))
                .append($("<input>").val(user.name))
                .append($("<tr>"))
                .append($("<input>").val(user.email))
                .append($("<tr>"))
                .append($("<input>").val(user.password))
                ;
        )
     catch (error) 
        console.log(error);
    
)();

看起来像这样

这里是html

<div class="centered">
        <h2>Profile page</h2>
        <form action="/users/me" method="GET">

            <table id="profile">
                <thead></thead>
                <tbody id="addData">

                </tbody>

            </table>
            <button type="submit" class="btn btn-primary">Update account</button>
            <a href="/login"><button class="btn btn-danger" id="btn-profile" onclick="deleteUser()">Delete
                    account</button></a>
        </form>

然后我希望能够编辑姓名和电子邮件并再次保存。以下是发帖路线:

router.post("/users/me", async (req, res) => 
    const updates = Object.keys(req.body)
    console.log("Updates1" + updates)
    const allowedUpdates = ["name", "email", "password", "age"]
    const isValidOperation = updates.every((update) => allowedUpdates.includes(update))

    if (!isValidOperation) 
        return res.status(400).send( error: "Invalid updates!" )
    

    try 
        updates.forEach((update) => req.user[update] = req.body[update])
        await req.user.save()
        console.log(updates)
        res.send(req.user)
        res.redirect("/profile");
     catch (e) 
        res.status(400).send(e)
    
)

以及对路由的 AJAX 调用:

(async function editProfile() 
    try 
        $.ajax(
            method: "POST",
            url: "/users/me",
            dataType: "json"
        ).done(function (user) 
            $("#addData")
                .append($("<tr>"))
                .append($("<input>").val(user.name))
                .append($("<tr>"))
                .append($("<input>").val(user.email))
                .append($("<tr>"))
                .append($("<input>").val(user.password))
                ;
        )
     catch (error) 
        console.log(error);
    
)();

当我单击更新 btn 时,我得到一个带有未编辑 json 的页面,如下所示:

任何帮助将不胜感激

【问题讨论】:

【参考方案1】:

我相信您正在寻找express-session,它允许您向客户端提供一个cookie,作为服务器上具有变量的对象的键。这样,当他们登录时,您就可以访问他们在您的数据库中出现的_id,并允许他们编辑他们的特定文档。

【讨论】:

以上是关于如何在页面上显示来自 mongodb 数据库的用户数据,编辑数据并再次保存的主要内容,如果未能解决你的问题,请参考以下文章

如何在 html 页面中显示 MongoDB 数据

如何设置我的 VPS Webmin/Virtualmin 服务器以在托管网站中显示来自 MongoDB 的数据?

来自 2 个表的数据未显示在同一页面上

如何在单独的 html 页面上显示来自提交表单的计算值? [复制]

如何在 HTML 页面上显示来自 FTP 服务器的图像? [复制]

如何通过 PyMongo 和 Bottle 显示来自 MongoDB 数据库的图像?