我最近一直在研究一个项目,它要求我将所需的名称发布到我的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");
}
});
});
});
有谁知道为什么会发生这种错误以及如何解决它?
答案 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')