Node.js错误:

我最近一直在做一个项目,它需要我POST所需的名字到我的profile.js文件,但是当我做console.log(req.body.bookName) (因为我发送的数据被称为bookName ),它给我的错误[Error: Query is required]

这是我的profile.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文件中的button

 <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"); } }); }); }); 

有谁知道为什么这个错误发生,我怎么能解决它?

读完你的评论后,我发现这个问题。

你发送给服务器的是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()来expression。 然后,在'/ profile'路由器上inputconsole.log req.body 。 你会看到身为JSON。

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

编辑2:你正试图发送表单和AJAX同时。 它不这样工作。 只要select一件事。 表单或AJAX。 我build议你使用AJAX。 使用$(document).on('click') e.preventDefault()来取消表单的默认行为

看看你的查询参数。 您正在传递此行books.search(req.body.search,如果您注意到, req.body.search是查询参数,但未在您要发布的正文中定义search{ bookName: $(this).attr("class")} ,只有书名。

我相信你打算使用: books.search(req.body.bookName...

更新:

所以我看到你有一个表单,你发布search。 问题是,当发布时, req.body.search被定义,但不是req.body.bookName 。 当你点击#detail ,这是一个全新的请求,在那里search没有被张贴。 在这一点上,您将需要获取search的值,并将其作为相同请求的一部分发布。 作为单独的请求,其中一个包含bookName ,另一个search但代码处于当前状态,它们不会像nodejs端点期望的那样一起发布。

希望这是帮助。