Node.js错误:[错误:需要查询]

时间:2017-08-11 03:25:38

标签: javascript node.js ajax post

我最近一直在研究一个项目,它要求我将所需的名称发布到我的profile.js文件中,但是当我console.log(req.body.bookName)时(因为我发送的数据叫做bookName),它给了我[Error: Query is required]

的错误

以下是我的个人资料.js代码的帖子部分

router.post('/', function(req, res){
if(req.session && req.session.user){
    Book.find({ owner: req.session.user.username || req.session.user }, function(err, book){
        if(err){
            console.log(err);
        }
        books.search(req.body.search, options, function(error, results) {
            if ( ! error ) {
                console.log(req.body.bookName);
                res.render("profile",{
                    authenticated: true,
                    info: books,
                    results: results
                });
            }
            else {
                console.log(error);
            }
        });

    });
}
else{
    res.status(401).send('You must be logged in to access this page');
}
})

这是我的.ejs文件中的按钮

<form method="POST">
        <input type="text" name="search" placeholder="Search..." required class="searchBook">
        <input type="submit" value="Search">
    </form>
    <% for(var i = 0; i < results.length; i++){ %>
        <div class="ui grid">
            <div class="column four wide">
                <div class="ui card">
                    <div class="image">
                        <img src = "<%= results[i].thumbnail %>"/>
                    </div>
                    <div class="content">
                        <div class="header">
                            <h1 class="ui small header title"><%= results[i].title %></h1>
                        </div>
                        <div class="meta">
                            <p>Author: <%= results[i].authors %></p>
                            <p>Published on: <%= results[i].publishedDate %></p>
                            <p>Pages: <%= results[i].pageCount %></p>
                        </div>
                    </div>
                    <div class="content extra">
                        <button id="detail" class="<%= results[i].title %>">View Detail</button>
                        <button class="ui button fluid" type="button" name="button">Add</button>
                    </div>
                </div>
            </div>
        </div>
        <div id="modaldiv" class="ui modal" style="position: relative">
            <i class="close icon"></i>
            <div class="header"><%=results[i].title%></div>
            <div class="content"><%=results[i].description%></div>
        </div><!-- Should be out side of the book info div -->
    <% } %>

这是我发布数据的home.js文件

$(document).ready(() => {
$(document).on("click", "#detail", function () {
    $.ajax({
        type: "POST",
        url: '/profile',
        dataType: 'text',
        data: { bookName: $(this).attr("class")},
        success: function (data) {
            location.reload();
            alert("done");
        }
    });
});
});

有谁知道为什么会发生这种错误以及如何解决它?

2 个答案:

答案 0 :(得分:1)

查看您的查询参数。如果您注意到,books.search(req.body.search,是查询参数但req.body.search未在您发布的正文中定义:search,则只传递了一个书名。

我相信您打算使用:{ bookName: $(this).attr("class")}

更新:

所以我看到你有一个用搜索发布的表单。问题是,当发布时,books.search(req.body.bookName...已定义,但不是req.body.search。然后,当您单击req.body.bookName时,这是一个全新的请求,其中未发布搜索。此时,您需要获取#detail的值并将其作为同一请求的一部分发布。 作为单独的请求,一个包含search,另一个包含bookName但是当前状态的代码,它们不会像nodejs端点所期望的那样发布在一起。

希望这有帮助。

答案 1 :(得分:1)

阅读完评论后,我发现了这个问题。

您发送给服务器的是JSON而不是文本。 { bookName: $(this).attr("class")}是JSON而不是文本。当然,bookName的值是一个文本,但整个数据是JSON。

你应该

$.ajax({
        type: "POST",
        url: '/profile',
        contentType: 'application/json',
        data: JSON.stringify({ bookName: $(this).attr("class")}),
        success: function (data) {
            location.reload();
            alert("done");
        }
    });

我相信你附上bodyParser.json()来表达。 然后,在&#39; /个人资料&#39;上的console.log req.body路由器。你会看到身体为JSON。

编辑:我发现的另一件事是你没有发送req.body.search 它应该是JSON.stringify({ bookName: $(this).attr("class"), search: $('.searchBook').val() })这就是你收到错误信息的原因。

EDIT2:您正在尝试同时发送表单和AJAX。它没有这样的工作。只选择一件事。表格或AJAX。我建议你使用AJAX。使用$(document).on('click')

中的e.preventDefault()取消表单的默认行为