Node.js - 从sql打印结果

时间:2016-11-14 15:09:37

标签: javascript node.js postgresql express nunjucks

我正在尝试从db运行select查询并打印结果。但即使我看到控制台中的结果我也没有在索引页面中看到。 (Hovewer我在控制台中看到了结果,但它也没有正确显示。我在db中有2行,但我看到每行有3行。因此控制台的结果是:2X3 = 6行。)我把关于控制台结果的截图问题的结尾。

app.js中的代码

app.use('/', routes, function(req, res){
    pg.connect(connect, function(err, client, done){
    if(err){
      return console.error('errrr', err)
    }
    client.query('select * from recipes', function(err, result){
    if(err){
      return console.error('error running query', err);
    }
     console.log(result.rows);
     res.render('index.njk', { recipes: result.rows});
     done(); 
    });
    }); 
    });

index.njk中的代码

<ul>
  {% for name, item in recipes %}
  <li>{{ name }}: {{ item.name }}</li>
  {% endfor %}
</ul>

this is result of the console 你能帮我解决一下吗?

2 个答案:

答案 0 :(得分:0)

看起来(通过控制台的图片)result.rows是一个数组数组,其中包含2个值。因此,在循环遍历index.njk中的值时,recipes是一个数组数组,不包含具有name属性的项。

如果您设置了食谱:result.rows [0]应提供快速修复:

res.render('index.njk', { recipes: result.rows[0]});

这允许你获取数组数组中的第一个元素,这是可以的,因为保存在内的数组只有1个元素(你实际想要的2个项目!)。您应该在执行此操作之前检查result.rows.length&gt; 0所以你不会越界并得到一个错误。

if(result.rows.length > 0) {
  res.render('index.njk', { recipes: result.rows[0]});
}else {
  console.log('No rows found in DB');
}

答案 1 :(得分:0)

我通过在index.js中使用以下代码块而不是使用app.js解决了我的问题。我不确定它是否正确但现在工作正常。如果方法不正确,请让我纠正。

router.get('/', function(req, res){
  pg.connect(connect, function(err, client, done){
   if(err){
    return console.error('errrr', err)
    }
   client.query('select * from recipes', function(err, result){

    if(err){
      return console.error('error running query', err);
     }
    if(result.rows.length > 0) {
        res.render('index.njk', { recordResult: result.rows});
       console.log(result.rows);
     }else {
        console.log('No rows found in DB');
      }
    done() 
    });
  }); 
});