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
相关产品推荐
相关产品推荐

