Home > Blockchain >  Update data in mongodb with input valors
Update data in mongodb with input valors

Time:09-22

I have three input to obtain three different values. Im using express.js , node.js, mongodb and ejs templates.

<form action="/save-profile/<%= user.id %>/<%= user.name %>/<%= user.lastname %>/<%= user.description %>" method="POST">
        <div class="input-group mb-3">
            <span class="input-group-text" id="basic-addon1">Name</span><%= user.username %>
            <input type="text" class="form-control" placeholder="'John'" aria-label="Username" name="username">
            <span class="input-group-text">lastName</span><%= user.lastname %>
            <input type="text" class="form-control" placeholder="" aria-label="Server" name="lastname">
        </div>
        <div class="input-group">
            <span class="input-group-text">Description:</span>
            <textarea class="form-control" aria-label="With textarea" placeholder="" name="description"><%= user.description %></textarea>
        </div>
        </p><br>
        <button class="btn btn-primary mb-10 btn-lg">Save</button>
    </div>
</div>

In js file:

router.post('/save-profile', async (req, res) => {
const profile_id = await User.findById({ _id: req.body.id })
const updatedName = await User.findOneAndUpdate({ username: req.body.username})
const updatedlastname = await User.findOneAndUpdate({ apellido: req.body.lastname })
const updatedDescription = await User.findOneAndUpdate({ description: req.body.description })
console.log(profile_id,updatedName,updatedApellido,updatedDescription)
res.redirect('/profile')})

I tried to do it with a get but it didn't work

CodePudding user response:

  1. Firstly, action attribute in the form tag accepts the path where you are handling the form data. You only need to pass the user.id, there's no need to pass the other fields for this use-case.
<form action="/save-profile/<%= user.id %>" method="POST">
...
</form>
  1. Secondly, in your route handler, the database record can be updated using only a single findOneAndUpdate call. You don't need to call it multiple times for every field if you're only going to update a single record.
  2. The path written in action attribute will appear as /save-profile/1, for instance, in your route handler. Value preceding /save-profile/ i.e. 1 can be accessed by modifying the path in route handler as /save-profile/:id and in the callback you can get it by req.params.id

Finally you have this.

router.post('/save-profile/:id', async (req, res) => {
  const response = await User.findOneAndUpdate(
    { _id: req.params.id },
    {
      username: req.body.username,
      apellido: req.body.lastname,
      description: req.body.description
    },
    { new: true }
  )
  // Do something with response  
  res.redirect('/profile')
})
  • Related