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. Вы должны создать свой собственный для этого
Пожалуйста, спросите, не понимаете ли вы что-то, потому что это может быть сложно впервые:)