开发者问题收集

req.body.Dates 未定义

2019-04-23
1174

我有 2 个下拉菜单,它们使用 SQL Server 动态填充。根据所选项目,我正在加载不同的 ejs 模板。我使用 AJAX 的帮助完成了此操作。但是,我希望能够根据所选条件加载数据。例如,如果选择 DD1 作为 Andrew 并将 DD2 选择为 Date ,则表应根据这些条件加载 7 列。

AKA

SELECT * FROM exTable x WHERE x.Name = 'Andrew' and x.Date = '4/22/2019'

我已经尝试过的 是将选定的项目从下拉列表传递到路由器,如下所示:

router.js

router.post('/selection', async (req, res) =>{
  try {
    var nameFromDB = await conn.query("SELECT DISTINCT pr.Name FROM WFS.Table1 pr WHERE pr.Group = 'Test'");
    var dateFromDB = await conn.query('SELECT r.Date FROM WFS.Table2 r');
    var tables = ("SELECT * FROM WFS.view v WHERE v.Date= '" + req.body.Dates + "' AND v.Name = '" + req.body.Names + "'");
    console.log("SELECT * FROM WFS.view v WHERE v.Date= '" + req.body.Dates + "' AND v.Name = '" + req.body.Names + "'");
       res.render('selection', {tables: tables, nameFromDB : nameFromDB , dateFromDB: datesFromDB});
    } 
      catch (err) {
        res.status(500)
        res.send(err.message)
    }
 });

这是 console.log 的输出:

SELECT top 100 * FROM WFS.view_workRequests_Extended v WHERE v.Revenue_Release_Id = '04/16/2019' AND v.Development_Manager = 'Andrew'

app.js

var bodyParser = require('body-parser');
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({
    extended: true
  }));
app.use('/', router);

index.ejs

<script>
 $(document).ready(function() {
   $('#DDD').on('change', function(event) {
     var selectedDate = $('#selections option:selected').val();
   });
   $('#DDN').on('change', function(event) {
     var selectedName = $('#selection option:selected').val();
   });

   $('#submitData').on('submit', function(e){
     e.preventDefault();
     $.ajax({
       type: "POST",
       url: "/selection",
       data: {selectedDate : selectedDate, selectedName : selectedName },
       success: function() {
         alert('success');
       }
     });
   });
 });    
</script>
<form action="/selection" method="POST">
  <select class="DateDD" id="DDD" name="Dates">
    <% for(var n=0; n < dateFromDB.recordset.length; n++) { %>
      <option><%= dateFromDB.recordset[n].Date%></option>
    <% } %>
  </select>
  <select class="NameDD" id="DDN" name="Names">
    <% for(var n=0; n < nameFromDB.recordset.length; n++) { %>
      <option><%= nameFromDB.recordset[n].Name%></option>
    <% } %>
  </select>
  <input type="submit" name="Submit" id="submitData" class="btn btn-primary" value="View Report" />
</form>

selection.ejs

包含与 INDEX.EJS 相同的内容(除了脚本标签之外)并且...

<table class="table table-bordered table-condensed table-striped">
  <% for(var n=0; n < tables.recordset.length; n++) { %>
    <tr>
      <td><%=tables.recordset[n].Name%></td>
      <td><%=tables.recordset[n].Date%></td>
      ....
      ....
    </tr>
  <% } %>
</table>

index.ejs 上提交表单后,会抛出此错误:

未定义日期

我不知道是什么导致了此错误,因为我能够在控制台中看到正在打印的名称和日期。任何帮助都将不胜感激,谢谢!

3个回答

您已拦截 onsubmit 事件并修改了通过 ajax 发送的数据的 names >

$.ajax({
  type: "POST",
  url: "/selection",
  data: {selectedDate : selectedDate, selectedName : selectedName }, // <-- here
  success: function() {
    alert('success');
  }
});

因此,您读取了 req.body 中的错误属性。您应该改为读取如下内容:

// for date
req.body.selectedDate
// for name
req.body.selectedName

您还声称

I am able to see the name and date in the console

您输入的控制台输出与相关代码中的查询不匹配。

1565986223
2019-04-24

这是基本的调试问题。 我可以建议您做几件事,例如:

  • 检查浏览器 devTools( 网络选项卡 )以查看正文有效负载是否已传递到服务器。
  • 在服务器(express)上,您是否使用了正文解析器中间件?更多信息请参见 此处 req.body 部分)。
  • 尝试使用 inspect 模式运行 nodejs 并连接您的 IDE(VSCode 是一个不错的选择)并添加一些断点。或者,您可以执行一些 console.log 来检查您从客户端获得了什么。
  • 您可以使用 postman 模拟浏览器请求来检查服务器端并确保它正常工作。
Tareq
2019-04-23

这是一个简单的错误,所以没什么大不了的,我知道这可能会令人沮丧。

我看到你使用日期、日期、日期和日期。我会寻找行号参考来给我一个线索。我会使用 chrome 和开发人员工具或 console.log 来查看我能走多远。

或者,我会使用不同的名称约定,如 date1、date2、date3、date4 或更具描述性的名称,这样我就可以确定哪个日期是什么,然后在缩小错误范围后,修复起来会容易得多。

David White
2019-04-23