You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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",
        });
    };
}

问题分析与修复方案

核心问题

  1. 连接文件未导出client:原数据库连接代码仅创建了client实例,但未导出,导致注册函数无法获取有效实例。
  2. 导入方式错误:const { client } = import("../db/index.mjs"); 中import()是动态导入,返回Promise,不能直接解构获取client。
  3. 连接被提前关闭:原连接文件中client.end;(即使改为client.end())会关闭数据库连接,导致后续注册操作无法复用client。
  4. 异步逻辑混乱:注册函数混用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 12:43:20