将复选框传递给服务器端时的奇怪遭遇

时间:2014-01-03 17:42:26

标签: node.js pug

从jade的模板表单传递一些参数到我的服务器时遇到一个奇怪的问题。

这是上下文,表单用于搜索电影,每个电影都可以通过一系列类型来表征。在我的表单中有一个复选框列表,如下所示:

div Genre :
    br
    label(for="genre") Drama
    input(type="checkbox", name="genre", value="Drama")
    label(for="genre") Crime
    input(type="checkbox", name="genre", value="Crime")
    label(for="genre") Thriller
    input(type="checkbox", name="genre", value="Thriller")
    label(for="genre") Action
    input(type="checkbox", name="genre", value="Action")
    label(for="genre") Adventure
    input(type="checkbox", name="genre", value="Adventure")
    label(for="genre") Sci-Fi
    input(type="checkbox", name="genre", value="Sci-Fi")
    label(for="genre") Biography
    input(type="checkbox", name="genre", value="Biography")
    label(for="genre") Comedy
    input(type="checkbox", name="genre", value="Comedy")
    label(for="genre") Music
    input(type="checkbox", name="genre", value="Music")
    label(for="genre") Romance
    input(type="checkbox", name="genre", value="Romance")

问题出在服务器端,当检查多个复选框时,每个方法都可以正常工作。例如,如果我检查“戏剧”和“犯罪”,我可以看到req.body.genre [0]包含“戏剧”,而req.body.genre [1]包含“犯罪”和 req.body.genre .length等于2

问题是如果我只检查一种类型,例如“戏剧”。 req.body.genre.length等于5 ,所有内容都存储为:

  • req.body.genre [0] =“D”;
  • req.body.genre [1] =“r”;
  • req.body.genre [2] =“a”;
  • req.body.genre [3] =“m”;
  • req.body.genre [4] =“a”;

当我只检查一种类型时出现问题,无论哪种类型。我不明白为什么!

我正试图动态构建一个查询:

// If a genre was selected
if (req.body.genre.length > 0)
{
    // If more than 1 genre was selected
    if (req.body.genre.length > 1)
    {
        query["genres"] = {};
        query["genres"]["$in"] = req.body.genre;
    }
    else
    {
        query["genres"] = req.body.genre;
    }
}

感谢您的帮助

2 个答案:

答案 0 :(得分:1)

试试这个:

input(type="checkbox", name="genre[]", value="Drama")

换句话说,不要使用genre作为名称,而是使用genre[](适用于所有INPUT元素)。

这告诉bodyParser中间件应始终将结果解析为数组(而不是在仅选中一个复选框时返回字符串,如果选择了多个复选框则返回一个数组,这就是您的情况中发生的情况) )。

您仍然可以在服务器上以req.body.genre的形式访问结果。

答案 1 :(得分:0)

我认为可能是因为当只检查1时,你没有收到一个数组,而是一个字符串。那个字符串长度,例如“戏剧”是5.那么你最终将所有字母分开。