Node.js - вывести результат из sql

Я пытаюсь запустить запрос на выборку из БД и распечатать результаты. Но даже если я вижу результат в консоли, я не вижу его на главной странице. (Однако, я вижу результат в консоли, но он также не отображается правильно. У меня есть 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>

это результат консоли Можете ли вы помочь мне исправить это?

2 ответа

Решение

Я решил свою проблему, используя приведенный ниже блок кода в 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() 
    });
  }); 
});

Похоже (через ваше изображение консоли), что result.rows - это массив массивов, в котором есть 2 значения. Поэтому, циклически изменяя значение в вашем index.njk, recipes является массивом массивов и не содержит элемента, который имеет атрибут name.

Если вы установите рецепты: result.rows[0], это должно обеспечить быстрое исправление:

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

Это позволяет вам получить первый элемент в вашем массиве массивов, и это нормально, потому что массив, содержащийся внутри, имеет только 1 элемент (2 элемента, которые вам действительно нужны!). Перед тем, как сделать это, вы должны проверить, что result.rows.length > 0, чтобы не выходить за пределы и получить ошибку.

if(result.rows.length > 0) {
  res.render('index.njk', { recipes: result.rows[0]});
}else {
  console.log('No rows found in DB');
}
Другие вопросы по тегам