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

Node.js更新用户表报错:未处理Promise拒绝与Utilisateur.query非函数

解决 Utilisateur.query is not a function 及未处理Promise拒绝问题

看起来你的代码遇到了两个核心问题:ORM模型调用错误,以及异步代码的错误处理逻辑不当。咱们一步步拆解解决:

1. 核心错误:Utilisateur.query is not a function

这个报错说明你的Utilisateur对象并没有提供query()方法,通常是以下几种场景导致的:

  • 模型未正确继承ORM基类:如果你用的是Objection.js这类ORM框架,模型必须继承框架的Model基类才能拥有query()这类内置方法。示例写法如下:
    const { Model } = require('objection');
    
    class Utilisateur extends Model {
      static get tableName() {
        return 'utilisateurs'; // 替换成你的实际数据表名
      }
    }
    
  • 模型未关联数据库连接:确保你已经将模型和数据库连接实例绑定。比如在Objection.js中,需要在初始化数据库后执行:
    // 假设knexInstance是你已经配置好的数据库连接实例
    Model.knex(knexInstance);
    
    这样所有继承自Model的类才能正常调用query()方法。
  • 导入/导出逻辑错误:检查你导入Utilisateur的路径是否正确,同时确认模型文件里是通过module.exports = Utilisateur正确导出的。

2. 异步代码与错误处理问题

你的代码还存在未处理的Promise拒绝,以及错误处理的逻辑漏洞:

  • 回调与async/await混用导致的错误捕获失效:bcrypt.hash本身支持Promise写法,完全没必要嵌套回调,改用Promise风格能让async/await的错误捕获更顺畅:
    try {
      const hash = await bcrypt.hash("ADMIN", saltRounds);
      const updateResult = await Utilisateur.query()
        .patch({ MOTPASS: hash })
        .where('NOGENE', 4219);
      console.log(`成功更新 ${updateResult} 条记录的密码`);
    } catch (err) {
      errorDbHandler.sendErrorHttp(err, res);
    }
    
  • 错误的catch写法:原来的.catch(console.log('err'))是错误的——你直接执行了console.log,而不是传递一个处理错误的函数。就算要用链式catch,也得写成.catch(err => console.error(err)),不过改用async/await后,外层的try/catch就能统一捕获所有异步错误了。
  • 外层try/catch无法捕获回调内的错误:原代码中bcrypt的回调是异步执行的,外层的try/catch根本抓不到回调里的Promise拒绝,这正是你看到UnhandledPromiseRejectionWarning的原因。

完整修正后的示例代码

假设你的ORM模型已经配置正确,修正后的启动初始化代码可以写成这样:

const Utilisateur = require('./models/Utilisateur'); // 替换成你的模型实际路径
const bcrypt = require('bcrypt');
const saltRounds = 10; // 确保你已经定义了这个变量

// 把更新逻辑封装成async函数,方便启动时执行
async function initAdminPassword() {
  try {
    const hash = await bcrypt.hash("ADMIN", saltRounds);
    const updateCount = await Utilisateur.query()
      .patch({ MOTPASS: hash })
      .where('NOGENE', 4219);
    console.log(`启动初始化:成功更新 ${updateCount} 条管理员密码`);
  } catch (err) {
    console.error('启动初始化:更新管理员密码失败', err);
    // 注意:如果是启动时的初始化逻辑,可能没有res对象,需要根据实际情况调整错误处理
    // errorDbHandler.sendErrorHttp(err, res); // 仅在有请求上下文时使用
  }
}

// 应用启动时执行
initAdminPassword();

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 21:57:48