首页 > 解决方案 > 无法在同一个 postgres 连接中读取('select')和写入('update')?

问题描述

我正在使用下面的代码来获取用户输入(名称、密码)并与 postgres 数据库进行比较以提供“登录”功能。我似乎能够毫无问题地接受用户输入并在数据库中找到所需的信息。当我尝试将信息写入/更新到数据库行时,会出现我的问题......我遇到程序崩溃和断开连接。我的脚本包括 2 个查询,一个用于“读取”,另一个用于“写入/更新”(已被注释掉)。

使用包含的代码会引发错误。但是,如果我删除/注释掉第二个查询(用于写入/更新数据库),则不会发生错误。我提供的代码显示该例程已被注释掉,因此不会引发错误。涉及的两个查询是一个使用“查询”变量(“读取”)和一个使用“模块”变量(“写入/更新”)

require('dotenv').config();
const url = require('url')
var pg = require('pg');
const params = url.parse(process.env.DATABASE_URL);
const auth = params.auth.split(':');

const config = {
 user: auth[0],
 password: auth[1],
 host: params.hostname,
 port: params.port,
 database: params.pathname.split('/')[1],
 max: 20,
 idleTimeoutMillis: 30000,
 connectionTimeoutMillis: 2000,
 ssl: false
};

var pool = new pg.Pool(config);

var bodyParser = require('body-parser')

//Use Express module
var express = require('express');
var app = express();
var io = require("socket.io");  //web socket external module

// create application/json parser
var jsonParser = bodyParser.json()

// create application/x-www-form-urlencoded parser
var urlencodedParser = bodyParser.urlencoded({ extended: false })



//Respond to POST from login form
app.post('/login', function (req, res) {  

 var now = new Date().getTime();

 //**Query PostGres database...

 var conString = "postgres://user:password@localhost:5432/mydatabase";
 var client = new pg.Client(conString);

 const query = {
  text: "SELECT * FROM users WHERE name = $1 AND pass = $2", 
  values: [String(req.body.user), String(req.body.password)]
 };

 var mods = "UPDATE users SET login = '" + now + "' WHERE name = '" + String(req.body.user) + "' AND pass ='" + String(req.body.password) + "';";

  pool.connect(function(err,client,done) {
     if(err){
     console.log("not able to get connection "+ err);
     res.status(400).send(err);
     } 

   client.query(query, function(err, result) {   
//   //call `done()` to release the client back to the pool
//   done(); 
    if(err){
    console.log(err);
    res.status(400).send(err);
    }

    if (typeof result.rows[0] === "undefined") {
    console.log("No user/password determined in DB for login attempt");

    } else {

    console.log(result.rows[0].name)
    console.log(result.rows[0].pass)
    console.log(result.rows[0].status)

     if (result.rows[0].status === "active") {
     console.log("User is determined to be ACTIVE in database");
     req.session.user = String(req.body.user);

     console.log("req.session.user is " + req.session.user);


      if (typeof req.session.user != "undefined") {

      console.log("Session User is DEFINED...!");
      console.log("Dashboard Accessed");

//       //callback...for WRITING into database...!
//
//       client.query(mods, function(err, result) {   
//    //   //call `done()` to release the client back to the pool
//    //   done(); 
//        if(err){
//        console.log(err);
//        //res.status(400).send(err);
//        }
//
//       });

       res.render('_user_steps',);

       console.log("SECONDARY WRITE AND OPERATION COMPLETE...!");

      } else {
      console.log("Session User is NOT DEFINED...!");

      }  //req.session.user is defined...OR NOT...


     } else {
     console.log("User is determined to be INACTIVE in database");
     }  //User ACTIVE...OR NOT...

    }  //user/password is 'undefined' (NOT found in database)...OR NOT 

   console.log(result.rows[0]);
   client.end();
   });
  });

});

是否可以在同一个池连接中进行读写操作而不会导致脚本崩溃......?究竟是什么导致了这种行为?任何建议将不胜感激。我提前谢谢你。

标签: node.jspostgresqlexpressselect

解决方案


推荐阅读