我有一个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}
答案 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)])