Node连接PostgreSQL时注册函数报query属性未定义的TypeError问题
问题:用户注册时出现
TypeError: Cannot read properties of undefined (reading 'query') 使用Node.js连接PostgreSQL数据库,已通过简单GET请求验证连接正常,但执行用户注册函数时触发上述错误,怀疑client变量未定义,尝试多种导入方式仍未解决。
数据库连接代码(原文件:
db/index.mjs) import pg from "pg"; const client = new pg.Client({ host: 'localhost', user: 'stephen', port: 5433, database: "ecommerceapp" }); client.connect(); client.query(`SELECT * FROM customer`, (err, res) => { if(!err) { console.log(res.rows); } else { console.log(err.message); } client.end; });
用户注册函数代码(原文件)
const bcrypt = require("bcrypt"); const jwt = require("jsonwebtoken"); const { client } = import("../db/index.mjs"); exports.register = async (req, res) => { const { name, email, password} = req.body; try { const data = await client.query(`SELECT * FROM customer WHERE email=$1`, [email]); const arr = data.rows; if(arr.length != 0) { return res.status(400).json({ error: "Email already in use.", }); } else { bcrypt.hash(password, 10, (err, hash) => { if(err) return res.status(err).json({ error: "Server error", }); const user = { name, email, password: hash }; var flag = 1; client.query(`INSERT INTO customer (name, email, password) VALUES ($1, $2, $3);`, [user.name, user.email, user.password], (err) => { if(err) { flag = 0; console.error(err); return res.status(500).json({ error: "Database error", }) } else { flag = 1; res.status(200).send({message: 'User added to databse, not verified'}); } }) if(flag) { const token = jwt.sign({ email: user.email }, process.env.SECRET_KEY ); } }) } } catch(err) { console.log(err); return res.status(500).json({ error: "Database error while registering user", }); }; }
问题分析与修复方案
核心问题
- 连接文件未导出
client:原数据库连接代码仅创建了client实例,但未导出,导致注册函数无法获取有效实例。 - 导入方式错误:
const { client } = import("../db/index.mjs");中import()是动态导入,返回Promise,不能直接解构获取client。 - 连接被提前关闭:原连接文件中
client.end;(即使改为client.end())会关闭数据库连接,导致后续注册操作无法复用client。 - 异步逻辑混乱:注册函数混用
async/await与回调函数,导致flag变量无法正确判断插入结果,代码可读性差。
修复步骤
1. 修改数据库连接文件,导出client并保留连接
修改db/index.mjs:
import pg from "pg"; const client = new pg.Client({ host: 'localhost', user: 'stephen', port: 5433, database: "ecommerceapp" }); // 建立连接并处理连接状态 client.connect() .then(() => console.log("数据库连接成功")) .catch(err => console.error("数据库连接失败:", err)); // 初始验证查询(可选),但不要关闭连接 client.query(`SELECT * FROM customer`, (err, res) => { if(!err) { console.log("初始查询结果:", res.rows); } else { console.error("初始查询失败:", err.message); } // 移除 client.end; 避免关闭连接 }); // 导出client,供其他模块导入使用 export { client };
2. 修复注册函数的导入与异步逻辑
统一使用ES模块语法,将回调改为async/await:
import bcrypt from "bcrypt"; import jwt from "jsonwebtoken"; import { client } from "../db/index.mjs"; export const register = async (req, res) => { const { name, email, password} = req.body; try { // 检查邮箱是否已存在 const data = await client.query(`SELECT * FROM customer WHERE email=$1`, [email]); if(data.rows.length !== 0) { return res.status(400).json({ error: "Email already in use." }); } // 加密密码 const hash = await bcrypt.hash(password, 10); // 插入用户数据 await client.query( `INSERT INTO customer (name, email, password) VALUES ($1, $2, $3);`, [name, email, hash] ); // 生成JWT Token const token = jwt.sign( { email: email }, process.env.SECRET_KEY ); res.status(200).send({ message: 'User added to database, not verified', token: token // 可选返回Token给前端 }); } catch(err) { console.error("注册错误:", err); return res.status(500).json({ error: "Database error while registering user" }); }; }
内容的提问来源于stack exchange,提问作者Stephen
相关产品推荐
相关产品推荐

