Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Cannot POST with Node.js Express MongoDB Mongoose CoffeeScript

Update: I found the solution, look in the bottom of this page...

I've got a Node.js, Express, MongoDB, Mongoose project written in CoffeScript and I can create and read data, but I can't update.

This is what my code looks like;

app.js

 # update
 app.put "/admin/:id.:format?", (req, res) ->
    Content.findById req.body.content.id, (err, c) ->
        c.title = req.body.content.title
        c.body = req.body.content.body
        c.save (err) ->
            switch req.params.format
                when "json"
                    res.send c.__doc
                else
                    res.redirect "/admin"

edit.jade

h2 Edit Content
form(method='post', action='/admin/' + c.id)
  input(name='content[id]', value=c.id, type='hidden')
  input(name='_method', value='PUT', type='hidden')
div
  label Title:
    input(name='content[title]', value=c.title || '')
div
  label Body:
    textarea(name='content[body]')=c.body || ''
div
  input(type='submit', value='Save')

And this is what my console says

127.0.0.1 - - [Thu, 13 Oct 2011 21:39:55 GMT] "POST /admin/4e96ec17fd7da7cb18000001 HTTP/1.1" 404 - "http://localhost:1234/admin/4e96ec17fd7da7cb18000001/edit" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_1) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.874.83 Safari/535.2"

And this is what my browser tells me

Cannot POST /admin/4e96ec17fd7da7cb18000001
like image 811
Alfred Avatar asked Jun 20 '26 10:06

Alfred


2 Answers

The form sends a POST request to the server, but your route is for PUT requests.

like image 51
s4y Avatar answered Jun 23 '26 14:06

s4y


I found the solution on http://expressjs.com/guide.html:

"When using methods such as PUT with a form, we can utilize a hidden input named _method, which can be used to alter the HTTP method. To do so we first need the methodOverride middleware, which should be placed below bodyParser so that it can utilize it’s req.body containing the form values."

app.use express.bodyParser()
app.use express.methodOverride()
like image 45
Alfred Avatar answered Jun 23 '26 16:06

Alfred



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!