node.js - .patch() 不使用 Knex 将参数保存到 Objection.js 中的数据库
问题描述
我正在创建 Express API,我正在使用 Objection.js 作为带有 Knex.js 的 ORM 我创建了路由器,用于从配置文件中更新用户密码,其中包含 2 个字段(旧密码和新密码),首先它验证旧密码(防止窃取 JWT 令牌)。在它返回有效条件后,我继续使用 bcrypt 散列新密码并使用 .patch() 更新它,否则它将返回验证错误旧密码它不是正确的密码。问题是当我发送相同的确切请求时,它意味着 .patch 不起作用并且没有将新密码保存到数据库中。任何人都可以解释这个问题的一些解决方案,或者可能用一些关于如何解决它的文档来打我代码如下:
router.patch('/updatepassword', async (req, res, next) => {
const { id } = req.user;
const {
oldPassword,
newPassword,
} = req.body;
try {
await passwordSchema.validate({
oldPassword,
newPassword,
}, {
abortEarly: false
});
const UserOldPassword = await User.query().select('password').findById(id);
const validOldPassword = await bcrypt.compare(oldPassword, UserOldPassword.password);
if (validOldPassword) {
const hashedPassword = await bcrypt.hash(newPassword, 12);
const defi = User.query().patch({ password: hashedPassword }).where('id', id).returning('*')
.first();
console.log(defi);
res.status(200).json({
message: returnMessage.passwordUpdated
});
} else {
const error = new Error(returnMessage.invalidOldPassword);
res.status(403);
throw error;
}
} catch (error) {
next(error);
}
});
控制台日志:
QueryBuilder {
_modelClass: [Function: User],
_operations: [
UpdateOperation {
name: 'patch',
opt: [Object],
adderHookName: null,
parentOperation: null,
childOperations: [],
model: [User],
modelOptions: [Object]
},
KnexOperation {
name: 'where',
opt: {},
adderHookName: null,
parentOperation: null,
childOperations: [],
args: [Array]
},
ReturningOperation {
name: 'returning',
opt: {},
adderHookName: null,
parentOperation: null,
childOperations: [],
args: [Array]
},
FirstOperation {
name: 'first',
opt: {},
adderHookName: null,
parentOperation: null,
childOperations: []
}
],
_context: QueryBuilderContext {
userContext: QueryBuilderUserContext { [Symbol()]: [Circular] },
options: InternalOptions {
skipUndefined: false,
keepImplicitJoinProps: false,
isInternalQuery: false,
debug: false
},
knex: null,
aliasMap: null,
tableMap: null,
runBefore: [],
runAfter: [],
onBuild: []
},
_parentQuery: null,
_isPartialQuery: false,
_activeOperations: [],
_resultModelClass: null,
_explicitRejectValue: null,
_explicitResolveValue: null,
_modifiers: {},
_allowedGraphExpression: null,
_findOperationOptions: {},
_relatedQueryFor: null,
_findOperationFactory: [Function: findOperationFactory],
_insertOperationFactory: [Function: insertOperationFactory],
_updateOperationFactory: [Function: updateOperationFactory],
_patchOperationFactory: [Function: patchOperationFactory],
_relateOperationFactory: [Function: relateOperationFactory],
_unrelateOperationFactory: [Function: unrelateOperationFactory],
_deleteOperationFactory: [Function: deleteOperationFactory]
}
PATCH /v1/profile/updatepassword 200 1346.797 ms - 42
解决方案
解决方案:不要忘记将 await 放在异步功能上。
推荐阅读
- sql - 如何制作符合此限制的 SQL 表?
- node.js - 我从事弹性搜索的查询。但是我的结果没有按 A 到 Z 排序。那么,我怎样才能按 A 到 Z 对结果进行排序
- html - 如何使用选项卡使 Nuxt.js 站点键盘可访问(a11y)?
- javascript - 如何使用 JavaScript 自动关闭 Chrome 通知?
- flutter - 参数类型“字符串”不能分配给参数类型“数据”
- c# - 使用 MS Graph 创建和管理 Sharepoint DocumentSet
- flutter - Flutter如何获得省市?
- javascript - WebVR - 功能
- javascript - 从多个 api 查询中按顺序返回结果
- node.js - 来自不和谐机器人代码的问题