NodeJs - 在多次SELECT查询后呈现相同的页面

时间:2016-12-04 15:51:41

标签: node.js postgresql express nunjucks

我的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() 
});
}); 
});

1 个答案:

答案 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.你应该为那个

创建自己的错误

请问你是否不理解某些东西,因为它第一次可能很复杂:)