2013-10-20 55 views
0

当我试图在Express中执行PUT请求时,它给了我这个错误,我不确定它的含义。ExpressJS Object PUT,DELETE没有方法'toLowerCase'

这是我的玉:

extends layout 

block content 
    form(method="post" action="/meals/#{meal[0].id}", id="mealForm") 
     input(type="hidden", name="_method", value="PUT") 

     h4 Meal Type 
     input.span3(id="mealType", type="text", name="MealType", value="#{meal[0].meal_type}") 

     br 

     h4 Meal Details 
     input.span3(id="mealDetails", type="text", name="MealDetails", value="#{meal[0].meal_details}") 

     br 

     input.btn(type="submit", class="btn btn-primary btn-lg" value="Update") 

     form(method="post" action="/meals/#{meal[0].meal_id}", id="mealForm") 
      input(type="hidden", name="_method", value="DELETE") 

      input.btn(type="submit", class="btn btn-danger btn-lg" style='margin-left: 1px;' value="Delete") 

我不明白为什么这是行不通的。这是我的app.js:

app.put('/meals/:id', meal.getMeal) 

在meals.js

exports.getMeal = function(req, res){ 
    console.log('sa') 
    id = req.params.id 

    query = "Select * \ 
     From nutrition \ 
     Where id=%" 

    query = query.replace(/%/g, id) 

    db.query(query, function(err, row) { 
     console.log(query); 
     if (err) console.log(err) 
     res.render('edit', { meal: row }); 
}) 
} 

堆栈跟踪:

500 TypeError: Object PUT,DELETE has no method 'toLowerCase' 
at Object.methodOverride [as handle] (\middleware\methodOverride.js:37:30) 
+1

安置自己的ExpressJS配置代码 –

+0

开始使用'var'每一个新的变量之前(如'id'和'query')。 – robertklep

+0

查询是一个全局变量。我会把它放在身份证上。 @hilarudeens我不知道你的意思是什么文件,但我发布package.json的快递http://jsfiddle.net/aUDuL/ – user2417731

回答

2

你的问题是在玉模板嵌套HTML表单。 你基本上做的是这样的:

<form method="post" action="/meals/#{meal[0].id}" id="mealForm"> 
    <input type="hidden" name="_method" value="PUT"> 
    <form method="post" action="/meals/#{meal[0].meal_id}" id="mealForm"> 
    <input type="hidden" name="_method" value="DELETE"> 
    </form> 
</form> 

表单不能嵌套。你可以在一个页面上放置更多的文件,但它们不能重叠或嵌套。例如:

<form method="post" action="/meals/#{meal[0].id}" id="mealForm"> 
    <input type="hidden" name="_method" value="PUT"> 
</form> 
<form method="post" action="/meals/#{meal[0].meal_id}" id="mealForm"> 
    <input type="hidden" name="_method" value="DELETE"> 
</form> 

代码的副作用是,它然后发送到一个Express作为数组[“PUT”,“删除”(因为你有你形成两个_method场 - 第二嵌套形式被忽略)而不是“PUT”或“DELETE”。 Express试图将接收到的方法转换为小写以进行比较,但Array没有方法toLowerCase,即String。

你可能只需要修复您的玉模板缩进这样的:

extends layout 

block content 
    form(method="post" action="/meals/#{meal[0].id}", id="mealForm") 
     input(type="hidden", name="_method", value="PUT") 

     h4 Meal Type 
     input.span3(id="mealType", type="text", name="MealType", value="#{meal[0].meal_type}") 

     br 

     h4 Meal Details 
     input.span3(id="mealDetails", type="text", name="MealDetails", value="#{meal[0].meal_details}") 

     br 

     input.btn(type="submit", class="btn btn-primary btn-lg" value="Update") 

    form(method="post" action="/meals/#{meal[0].meal_id}", id="mealForm") 
     input(type="hidden", name="_method", value="DELETE") 

     input.btn(type="submit", class="btn btn-danger btn-lg" style='margin-left: 1px;' value="Delete") 
相关问题