0

当我尝试在 Express 中执行 PUT 请求时,它给了我这个错误,我不确定这意味着什么。

这是我的玉:

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)

在饭菜.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)
4

1 回答 1

2

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

<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>

您的代码的副作用是它会以数组 ["PUT", "DELETE"] 的形式发送到 Express (因为您的表单中有两个 _method 字段 - 第二个嵌套表单被忽略)而不仅仅是“PUT”或“删除”。Express 尝试将接收到的方法转换为小写进行比较,但 Array 没有 String 所具有的 toLowerCase 方法。

您可能只需要像这样修复 Jade 模板缩进:

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")
于 2013-10-22T07:24:21.897 回答