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');
}