NODEJS,PUG,EXPRESS-无法读取未定义的属性“ length”

时间:2018-08-09 07:27:50

标签: node.js function api for-loop pug

我有一个API,可以对数据库进行2次调用并提取信息。.我可以在控制台日志中看到结果,所以我知道它可以正常工作

下一部分是当它渲染视图时,我需要在两个地方显示结果

这是API的代码,该API两次调用数据库

function apples(req, res, next) {
  sql.connect(config, function () {
    var request = new sql.Request();
    request.query("select price from table WHERE fruit = 'apples'", function(err, recordsetapples) {
      var arrayLength = recordsetapples.length;
      for (var i = 0; i < arrayLength; i++) {
        console.log(recordsetapples[i]["price"]);
      };
      res.render('index', { resultsapples: recordsetapples });
        return next();
    });
  });
};

function pear(req, res, next) {
  sql.connect(config, function () {
    var request = new sql.Request();
    request.query("select price from table WHERE fruit = 'pear'", function(err, recordsetpear) {
      var arrayLength = recordsetpear.length;
      for (var i = 0; i < arrayLength; i++) {
        console.log(recordsetpear[i]["price"]);
      };
      res.render('index', { resultspear: recordsetpear });
        next();
    });
  });
};



app.get('/fruit', apples, pear);

因此,在运行之后,我可以在控制台日志中看到价格打印。然后,我看到此错误

Cannot read property 'length' of undefined

我希望看到价格是否出现...要获取该信息,我需要此代码

      tr
        th.hidden-phone Fruit
        th.hidden-phone Price
      tr
      each val in resultsapples
        td.hidden-phone Apples
        td.hidden-phone !{val.price}
      tr
      each val in resultspear
        td.hidden-phone Pears
        td.hidden-phone !{val.price}

2 个答案:

答案 0 :(得分:1)

问题是您的视图同时需要两个列表,但是您尝试用每个列表分别渲染两次视图,这意味着在两种情况下,视图中的一个列表都是undefined

即使您要解决此问题,该方法也无法使用,因为在第一个res.render之后,HTTP响应将结束并返回到客户端。理想情况下,您需要对这两个结果集进行一次数据库访问,然后渲染视图,例如

sql.connect(config, () => {
  const request = new sql.Request();
  request.query("select price from table WHERE fruit = 'apples' OR fruit = 'pear'", (err, result) => {
    res.render('index', { 
      resultsapples: result.recordsets[0], 
      resultspear: result.recordsets[1]
    });
  });
});

答案 1 :(得分:0)

正如James提到的,您的回调是异步的,因此您尝试两次渲染视图。您还需要在sql函数中进行一些错误处理

B2

现在记录下来,我不喜欢嵌套这样的回调,所以我实际上建议您查看Promises和/或"Get_info",但是我不确定您的编码级别,所以我没有不想一次向您提出太多概念。

而且,尽管James将您的SQL语句合并为一个(这可能是您的正确方法),但我不知道您是否在其他地方重用了这些单独的代码,因此不想将它们组合在一起。

如果您对promise实现感兴趣,它可能如下所示:

let size = text.size(withAttributes:[.font: UIFont.systemFont(ofSize:18.0)])