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

Node.js创建PostgreSQL用户表后密码正则校验失效求助

问题原因及修复方案

问题出在PostgreSQL的正则解析规则上:你写的密码校验正则里用了\d来匹配数字,但PostgreSQL默认通过~操作符使用POSIX扩展正则,\d并不是POSIX正则里的有效数字匹配元字符,导致明明符合要求的密码Abcd@1234无法通过校验。

另外还要注意:JavaScript模板字符串里的反斜杠需要转义(写成\\),否则会被丢失,你原代码里的手机号正则\+和密码正则\d都存在这个隐性问题。

两种修复方式

方式1:改用POSIX兼容的数字匹配规则

把正则里的\d替换成[0-9],同时修复反斜杠转义问题,修改后的建表语句如下:

import { pool } from '../models/pool';
const createUsersTable = `
CREATE TABLE IF NOT EXISTS users (
  id SERIAL PRIMARY KEY,
  firstName VARCHAR NOT NULL CHECK (LENGTH(firstName) BETWEEN 3 AND 150),
  lastName VARCHAR(86),
  userEmail TEXT NOT NULL UNIQUE CHECK (LENGTH(userEmail) BETWEEN 5 AND 280),
  mobileNumber TEXT NOT NULL UNIQUE CHECK (mobileNumber ~ '^([0|\\+[0-9]{2})?([7-9][0-9]{9})$'),
  password VARCHAR NOT NULL CHECK (password ~ '^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[^0-9a-zA-Z]).{8,}$'),
  gender VARCHAR NOT NULL CHECK (gender IN ('MALE','FEMALE','OTHERS'))
  )
  `;

export const executeQueryArray = async (arr) =>
  new Promise((resolve) => {
    const stop = arr.length;
    arr.forEach(async (q, index) => {
      await pool.query(q);
      if (index + 1 === stop) resolve();
    });
  });
export const createTables = () => executeQueryArray([createUsersTable]);

(注:同时修正了createTables里的变量名错误,原代码写的createTableQueries实际应为createUsersTable)

方式2:启用Perl兼容正则模式

在正则开头加(?p)前缀,让PostgreSQL使用Perl风格正则,这样\d就能正常匹配数字,同时修复反斜杠转义:

import { pool } from '../models/pool';
const createUsersTable = `
CREATE TABLE IF NOT EXISTS users (
  id SERIAL PRIMARY KEY,
  firstName VARCHAR NOT NULL CHECK (LENGTH(firstName) BETWEEN 3 AND 150),
  lastName VARCHAR(86),
  userEmail TEXT NOT NULL UNIQUE CHECK (LENGTH(userEmail) BETWEEN 5 AND 280),
  mobileNumber TEXT NOT NULL UNIQUE CHECK (mobileNumber ~ '(?p)^([0|\\+[0-9]{2})?([7-9][0-9]{9})$'),
  password VARCHAR NOT NULL CHECK (password ~ '(?p)^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[^\\da-zA-Z]).{8,}$'),
  gender VARCHAR NOT NULL CHECK (gender IN ('MALE','FEMALE','OTHERS'))
  )
  `;

export const executeQueryArray = async (arr) =>
  new Promise((resolve) => {
    const stop = arr.length;
    arr.forEach(async (q, index) => {
      await pool.query(q);
      if (index + 1 === stop) resolve();
    });
  });
export const createTables = () => executeQueryArray([createUsersTable]);

修复后重新执行建表逻辑,再插入密码Abcd@1234即可通过校验。

内容的提问来源于stack exchange,提问作者Thirumalesu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 17:57:31