我的index.js文件中有以下代码。我可以打印配置文件表的数据。我需要在同一个(index.njk)页面中打印恢复表的数据。但我不能。我还找到了similar question,但我是新手,根据我的项目无法修改这些代码。你能帮忙吗?
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()
});
});
});
答案 0 :(得分:0)
所有异步内容的最佳解决方案是使用Promises。
您的代码使用配置连接池,但稍后您不使用池,但使用它通常是个好主意。
您创建一个新模块db.js
来查询db
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.你应该为那个
请问你是否不理解某些东西,因为它第一次可能很复杂:)