NodeJs - рендеринг одной и той же страницы после нескольких запросов SELECT

У меня есть коды ниже в моем файле index.js. Я могу распечатать данные таблицы профиля. И мне нужно напечатать данные таблицы резюме также на той же (index.njk) странице. Но я не мог. Я также нашел похожий вопрос, но я новичок и не смог изменить эти коды в соответствии с моим проектом. Можете ли вы помочь?

var express = require('express'),
path = require('path'),
bodyParser = require('body-parser'),
router = express.Router(),
app = express();
var pg =require('pg');

// DB Connect string
var connect = {
user: 'arslan', 
database: 'resumedb', 
password: '1984',
host: 'localhost', 
port: 5432, 
max: 10, 
idleTimeoutMillis: 30000, 
};

router.get('/', function(req, res){
pg.connect(connect, function(err, client, done, skills){
  if(err){
    return console.error('errrr', err)
  }
  //Get Profile Informations
client.query('select id,fname,lname,title,description,profileimage from profile', function(err, result){

    if(err){
      return console.error('error running query', err);
    }
   if(result.rows.length > 0) {
          res.render('index.njk', { 
                profileName: result.rows[0].fname,
                profileLName: result.rows[0].lname , profileTitle: result.rows[0].title
              , profileDesc: result.rows[0].description 
              , profileImage: result.rows[0].profileimage
          });

       console.log(result.rows[0].profileimage);
    }else {
        console.log('No rows found in DB');
    }
    done() 
});
}); 
});

1 ответ

Лучшее решение для всего асинхронного - использование Promises. Ваш код использует конфигурацию для пула подключений, но позже вы не используете пул, но часто его рекомендуется использовать. Вы создаете новый модуль db.js запросить БД

const pg = require('pg')

const connect = { // Normaly you would use an config file to store this information
  user: 'arslan',
  database: 'resumedb',
  password: '1984',
  host: 'localhost',
  port: 5432,
  max: 10,
  idleTimeoutMillis: 30000
}

let pool = new pg.Pool(config)

exports.query = (query, values) => {
  return new Promise((resolve, reject) => {
    pool.connect(function(err, client, done) {
      if (err)
        return reject(err)
      client.query(query, values, (err, result) => {
        done()
        if (err)
          return reject(err)
        resolve(result)
      })
    })
  })
}

exports.queryOne = (query, values) => {
  return new Promise((resolve, reject) => {
    this.query(query, values).then(rows => {
      if (rows.length === 1) {
        resolve(rows[0])
      } else if (rows.length === 0) {
        resolve()
      } else {
        reject(new Error('More than one row in queryOne'))
      }
    }).catch(err => {
      reject(err)
    })
  })
}

pool.on('error', function (err, client) {
  console.error('idle client error', err.message, err.stack)
})

а затем в вашем маршруте

// ...
const db = require('./db')

router.get('/', function(req, res, next) {

  let profileQuery = db.queryOne('select id,fname,lname,title,description,profileimage from profile')
  let resumeQuery = db.query('???')
  Promise.all([profileQuery, resumeQuery]).then(([profile, resume]) => {
    if (!profile) {
        return res.status(404).send('Profile not found') // error page
    res.render('index.njk', { 
            profileName: profile.fname,
            profileLName: profile.lname,
            profileTitle: profile.title,
            profileDesc: profile.description,
            profileImage: profile.profileimage
      })
  }).catch(err => {
    next(err)
  })

})

Если вы хотите сделать один запрос, вы можете использовать db.query('select 1 + 1').then(rows => { /* your code */}).catch(err => { next(err) }), Потому что вы часто хотите только одну строку, которую вы можете использовать queryOne, Возвращается undefined без строк, нужной строки или ошибки для нескольких строк

next() с ошибкой в ​​качестве аргумента вызовет экспресс-обработчики ошибок. Там вы можете записать ошибку и вернуть 500. Вы должны создать свой собственный для этого

Пожалуйста, спросите, не понимаете ли вы что-то, потому что это может быть сложно впервые:)

Другие вопросы по тегам