Когда я обновляю одно значение объекта users, все остальные значения удаляются в базе данных. Что я могу сделать по этому поводу? - PullRequest
1 голос
/ 23 марта 2020

Я работаю над школьным проектом с командой разработчиков. Мы создали страницу, где у пользователей есть профиль, и этот профиль можно обновлять. Мы столкнулись с ошибкой, когда пользователь обновляет свою информацию. Например, если я обновлю свой город, вся другая информация о моем пользователе исчезнет. Я должен обновить и другие поля, иначе в базе данных будет храниться только город, который я недавно обновил.

Я хочу, чтобы информация, которую я заполнил при создании моего пользователя, была сохранена, кроме как из информация, которую я изменяю при обновлении моего пользователя.

До обновления: {"username":"bobox","email":"bobox@hotmail.com","password":"test234","gender":"Man","age":"17","city":"Jönköping","games":"Battlefield V","usernameDiscord":"bigbox","usernameSteam":"bigbox","usernameOrigin":"bobox","_id":"wTs8IyRmcA40f3VN"}

После обновления: {"username":"bobox","email":"bobox@hotmail.com","password":"test234","gender":"","age":"","city":"New York","games":"","usernameDiscord":"","usernameSteam":"","usernameOrigin":"","_id":"wTs8IyRmcA40f3VN"}

Вот код Я благодарен за всю помощь. Если есть что-то, что вам нужно знать, просто дайте мне знать.

Обновление пользователя: script. js

async function updateUser(age, city, gender, games, discord, steam, origin) {
    const id = localStorage.getItem("userId")
    const response = await fetch('http://localhost:8080/users/' + id, {
        method: 'PATCH',
        headers: {
            'Content-Type': 'application/json',
        },
        body: JSON.stringify({
            age: age,
            city: city,
            gender: gender,
            games: games,
            usernameDiscord: discord,
            usernameSteam: steam,
            usernameOrigin: origin
        })
    })
    console.log(response)
    const data = await response.json()
    console.log(data)
}

function updateUsersIndex() {
    let updateProfileBtn = document.querySelector(".Profile-Right__Update")
    console.log(updateProfileBtn)
    updateProfileBtn.addEventListener("click", async(event) => {
        console.log("hej")
        event.preventDefault()
        const age = document.querySelector(".Age__Input").value
        const city = document.querySelector(".City__Input").value
        const gender = document.querySelector(".Gender__Input").value
        const discord = document.querySelector(".Discord__Input").value
        const steam = document.querySelector(".Steam__Input").value
        const origin = document.querySelector(".Origin__Input").value
        const games = document.querySelector(".Profile-Right__Select-Game").value
        const hidden = document.querySelector(".hidden")
        const updateUsers = await updateUser(age, city, gender, games, discord, steam, origin)
    })
}
updateUsersIndex()

let profileUpdateBackBtn = document.querySelector(".Profile-Right__Back")
profileUpdateBackBtn.addEventListener("click", async(event) => {
    event.preventDefault()
    let updateProfile = document.querySelector(".Update-Profile")
    let profile = document.querySelector(".Profile__Wrappe")
    profile.classList.toggle("Hidden")
    updateProfile.classList.toggle("Hidden")
})

app. js:

app.patch('/users/:id', async(req, res) => {
    const result = await collectionsNEDB.users.update({ _id: req.params.id }, {
        $set: {
            "age": req.body.age,
            "city": req.body.city,
            "gender": req.body.gender,
            "games": req.body.games,
            "usernameDiscord": req.body.usernameDiscord,
            "usernameSteam": req.body.usernameSteam,
            "usernameOrigin": req.body.usernameOrigin
        }
    })
    console.log(req.params.id)
    res.json(result)
})

Создание пользователя: script. js

async function createUser(username, email, password, repeatPassword, games, usernameDiscord, usernameSteam, usernameOrigin) {
    const response = await fetch('http://localhost:8080/register', {
        method: 'POST',
        headers: {
            'Content-Type': 'application/json'
        },
        body: JSON.stringify({
            username: username,
            email: email,
            password: password,
            repeatPassword,
            games: games,
            usernameDiscord: usernameDiscord,
            usernameSteam: usernameSteam,
            usernameOrigin: usernameOrigin

        })
    })
    console.log(response)
    const data = await response.json()
    if (response.status == 200) {
        console.log(data.message)
        if (data.message == "SUCCESS") {
            console.log("Great")
            let Success = document.querySelector(".Success")
            Success.innerHTML = "Användare skapad!"
            alert("Användare skapad!")
        }
    } else {
        const data = await response.json()
        const p = document.querySelector("p")
        p.innerHTML = ""
        for (let i = 0; i < data.errors.length; i++) {
            const error = data.errors[i]
            console.log(data.errors)
            switch (error) {
                case "ERROR_USER_ALREADY_EXISTS":
                    const hidden = document.querySelector(".Error")
                    hidden.classList.toggle("Hidden")
                    hidden.innerHTML = "Användarnamnet existerar redan!"
                    break;
                case "ERROR_EMAIL_ALREADY_EXISTS":
                    const hiddenEmail = document.querySelector(".Error__Email")
                    hiddenEmail.classList.toggle("Hidden__Email")
                    hiddenEmail.innerHTML = "E-mail existerar redan!"
                    break;
                case "ERROR_PASSWORD_MISMATCH":
                    const hiddenPassword = document.querySelector(".Error__Password")
                    hiddenPassword.classList.toggle("Hidden__Password")
                    hiddenPassword.innerHTML = "Lösenordet matchar inte"
                    break;
            }
        }
    }
}

function init() {
    let form = document.querySelector("#Reg-Form-1")
    form.addEventListener("submit", async(event) => {
        event.preventDefault()
        const username = form.querySelector(".username").value
        const email = form.querySelector(".email").value
        const password = form.querySelector(".password").value
        const repeatPassword = form.querySelector(".repeat-password").value
        const games = form.querySelector(".gejms").value
        const usernameDiscord = form.querySelector(".usernameDiscord").value
        const usernameSteam = form.querySelector(".usernameSteam").value
        const usernameOrigin = form.querySelector(".usernameOrigin").value
        const hidden = document.querySelector(".hidden")
        const createUsers = await createUser(username, email, password, repeatPassword, games, usernameDiscord, usernameSteam, usernameOrigin)
    })
}
init()

app. js:

app.post("/register", async(req, res) => {
    let user, email

    if (process.env.NODE_ENV == "development") {
        user = await collectionsNEDB.users.find({ username: req.body.username })
        email = await collectionsNEDB.users.find({ email: req.body.email })
    } else {
        dataUser = await Database.collections.users.find({ username: req.body.username })
        dataEmail = await Database.collections.users.find({ email: req.body.email })
        user = await dataUser.toArray()
        email = await dataEmail.toArray()
    }
    let errors = []
    if (req.body.password !== req.body.repeatPassword) {
        errors.push("ERROR_PASSWORD_MISMATCH")
    } else if (user == false) {
        if (email == false) {
            let newUser = {
                username: req.body.username,
                email: req.body.email,
                password: req.body.password,
                gender: "",
                age: "",
                city: "",
                games: req.body.games,
                usernameDiscord: req.body.usernameDiscord,
                usernameSteam: req.body.usernameSteam,
                usernameOrigin: req.body.usernameOrigin
            }
            if (process.env.NODE_ENV == "development") {
                const result = await collectionsNEDB.users.insert(newUser)
                res.status(200).json({ message: "SUCCESS" })

            } else {
                let db = await Database.connect()
                let users = db.collection("users")
                const result = await users.insert(newUser)
                res.status(200).json({ message: "SUCCESS" })
                console.log(result)
            }
        } else {
            errors.push("ERROR_EMAIL_ALREADY_EXISTS")
        }
    } else {
        errors.push("ERROR_USER_ALREADY_EXISTS")
    }
    if (errors.length > 0) {
        res.status(400).json({ errors: errors })
    }
})

1 Ответ

0 голосов
/ 23 марта 2020

Проблема заключается в том, что пустые поля формы будут перезаписывать существующие поля БД пустыми строками.

Решение состоит в том, чтобы предварительно заполнить форму всеми текущими значениями: в маршруте, который отображает форму «обновить пользователя» загрузить информацию о пользователе и передать ее в шаблон, а затем вставить в <input> s как value.

Это также позволяет пользователю снова удалить информацию, просто опустошив поле и отправив форма.

Последнее замечание: вы должны заменить

$set: {
        "age": req.body.age,
        "city": req.body.city,
        "gender": req.body.gender,
        "games": req.body.games,
        "usernameDiscord": req.body.usernameDiscord,
        "usernameSteam": req.body.usernameSteam,
        "usernameOrigin": req.body.usernameOrigin
    }

на

$set:  req.body
...