2016-07-10 3 views
1

Я ничего не меняю, но изменяю метод маршрута от «Post» до «Put», и по какой-то причине он его разрывает.Маршрут Expressjs/Nodejs работает с POST, но не с PUT

Маршрут POST работает отлично:

В пути в App.js с POST:

app.post('/editlisting/update',listing.update); 

файл editListing.jade, который отправляет к нему:

extends layout 

block content 
    div(class="container") 
     ul(class="userlist") 
     each listing, i in listings 
     li 
      h1 #{listing.name} 
      form(method='post', action='update' class='regform') 
      label Name: 
      input(type='text', name='name', value='#{listing.name}') 
      br 
      label Number of Guests: 
      input(type='text', name='noGuests', value='#{listing.noGuests}') 
      input(type='hidden', name='id', value='#{listing._id}') 
      label Price: 
      input(type='text', name='price', value='#{listing.price}') 
      input(type='submit', value='Update') 
      a(href='/') Home 

Метод обновления in listing.js (я этого не меняю):

 exports.update = function(req,res){ 
    var conditions = {_id:req.body.id} 
    , update = { 
     name: req.body.name, 
     noGuests: req.body.noGuests, 
     price: req.body.price 
    } 
    , options = { multi: false }; 

Listing.update(conditions, update, options, callback); 

    function callback (err, numAffected) { 
    if(err) { throw err; } 
    res.redirect('/'); 
    }; 

} 

Тогда, когда я пытаюсь изменить его PUT ....

app.js:

app.put('/editlisting/update',listing.update); 

editListing.Jade:

расширяет компоновки

block content 
    div(class="container") 
     ul(class="userlist") 
     each listing, i in listings 
     li 
      h1 #{listing.name} 
      form(method='put', action='update' class='regform') 
      label Name: 
      input(type='text', name='name', value='#{listing.name}') 
      br 
      label Number of Guests: 
      input(type='text', name='noGuests', value='#{listing.noGuests}') 
      input(type='hidden', name='id', value='#{listing._id}') 
      label Price: 
      input(type='text', name='price', value='#{listing.price}') 
      input(type='submit', value='Update') 
      a(href='/') Home 

Это вызывает мое браузер, чтобы отобразить эту ошибку, когда я нажимаю кнопку «Обновить»:

4 | div (class = "container") 5 | ul (class = "userlist")> 6 | каждый листинг, я в листингах 7 | li 8 | h1 # {listing.name} 9 | форма (метод = «ставить», действие = «обновление» класс = «regform») Не удается прочитать свойство «длина» неопределенной

И это указывает на строки в моем файле editListing.jade:

each listing, i in listings 

Кто-нибудь знает, в чем проблема?

+0

У вас есть доступ к req.body, когда вы меняете метод на PUT? Console.log (req.body) в вашей функции обновления для проверки. Также проверьте, есть ли какие-либо записи, сделанные в вашей базе данных после обновления. – marton

ответ

2

Самый простой способ вы можете сделать, это метод наиважнейшая

запустить НПМ метод установки Непереопределяемый

включить его в приложении после тела-парсера что-то вроде этого

var express = require('express'), 
    bodyParser = require('body-parser'), 
    methodOverride = require('method-override') 
    app = express(); 


app.use(bodyParser.urlencoded({ extended: true })); 
app.use(methodOverride('_method')); 

Затем измените html

block content 
    div(class="container") 
     ul(class="userlist") 
     each listing, i in listings 
     li 
      h1 #{listing.name} 
      form(method='POST', action='/editlisting/update?_method=PUT' class='regform') 
      label Name: 
      input(type='text', name='name', value='#{listing.name}') 
      br 
      label Number of Guests: 
      input(type='text', name='noGuests', value='#{listing.noGuests}') 
      input(type='hidden', name='id', value='#{listing._id}') 
      label Price: 
      input(type='text', name='price', value='#{listing.price}') 
      input(type='submit', value='Update') 
      a(href='/') Home 

то вы сможете использовать

app.put('/editlisting/update',listing.update); 
Смежные вопросы