- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
编辑:
问题正是在身份验证中(实际上它工作正常,但是, token 指的是数据库中的旧用户 ID):
const { email, oldPassword } = req.body;
const user = await User.findByPk(req.userId);
if (email !== user.email) {
const userExists = await User.findOne({ where: { email } });
if (userExists) {
return res.status(400).send({ error: 'User already exists.' });
}
}
可能,在我手动更改数据库后, token 无法识别这一点。 (我也设置了 7 天到期)
Executing (default): SELECT "id", "name", "email", "password_hash", "provider", "created_at" AS "createdAt", "updated_at" AS "updatedAt" FROM "users" AS "User" WHERE "User"."id" = 7;
(node:1616) UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'email' of null
at update (C:\Project\src\app\controllers\UserController.js:56:24)
at processTicksAndRejections (internal/process/task_queues.js:93:5)
(Use `node --trace-warnings ...` to show where the warning was created)
(node:1616) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). To terminate
the node process on unhandled promise rejection, use the CLI flag `--unhandled-rejections=strict` (see https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 1)
(node:1616) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
附:
WHERE "User"."id" = 7;
(在这种情况下,用户数据库中的 ID 将为 = 1)
at update (C:\Project\src\app\controllers\UserController.js:56:24)
UserController 上的这部分代码:
if (email !== user.email) { // <<<---- Here
const userExists = await User.findOne({ where: { email } });
if (userExists) {
return res.status(400).send({ error: 'User already exists.' });
}
}
理解问题:
routes.use(authMiddleware);
(在 ./src/routes.js 中)
import { Router } from 'express';
import UserController from './app/controllers/UserController';
import authMiddleware from './app/middlwares/auth';
const routes = new Router();
routes.use(authMiddleware);
routes.put('/users', UserController.update);
export default routes;
.src/app/controllers/UserController.js
import User from '../models/User';
class UserController {
async update(req, res) {
const { email, oldPassword } = req.body;
const user = await User.findByPk(req.userId);
if (email !== user.email) {
const userExists = await User.findOne({ where: { email } });
if (userExists) {
return res.status(400).send({ error: 'User already exists.' });
}
}
if (oldPassword && !(await user.checkPassword(oldPassword))) {
return res.status(401).json({ error: 'Password does not match' });
}
const { id, name, provider } = await user.update(req.body);
return res.json({
id,
name,
email,
provider,
});
}
}
export default new UserController();
./src/app/models/User.js
import Sequelize, { Model } from 'sequelize';
import bcrypt from 'bcryptjs';
class User extends Model {
static init(sequelize) {
super.init(
{
name: Sequelize.STRING,
email: Sequelize.STRING,
password: Sequelize.VIRTUAL,
password_hash: Sequelize.STRING,
provider: Sequelize.BOOLEAN,
},
{
sequelize,
}
);
this.addHook('beforeSave', async (user) => {
if (user.password) {
user.password_hash = await bcrypt.hash(user.password, 8);
}
});
return this;
}
checkPassword(password) {
return bcrypt.compare(password, this.password_hash);
}
}
export default User;
./src/database/migrations/number-create-users.js
module.exports = {
up: async (queryInterface, Sequelize) => {
await queryInterface.createTable('users', {
id: {
type: Sequelize.INTEGER,
allowNulll: false,
autoIncrement: true,
primaryKey: true,
},
name: {
type: Sequelize.STRING,
allowNulll: false,
},
email: {
type: Sequelize.STRING,
allowNulll: false,
unique: true,
},
password_hash: {
type: Sequelize.STRING,
allowNulll: false,
},
provider: {
type: Sequelize.BOOLEAN,
defaultValue: false,
allowNulll: false,
},
created_at: {
type: Sequelize.DATE,
allowNulll: false,
},
updated_at: {
type: Sequelize.DATE,
allowNulll: false,
},
});
},
down: async (queryInterface) => {
await queryInterface.dropTable('users');
},
};
HTTP/PUT JSON 数据:
{
"name": "user000",
"email": "email000@domain.com.br",
"oldPassword": "password000",
"password": "123456",
"confirmPassword": "123456"
}
考虑到用户已经通过身份验证。
最佳答案
问题可能是以下查询未找到用户。因此 user
可能是 undefined
。你确定这条线是正确的吗?
const user = await User.findByPk(req.userId);
并且
userId
不应该出现在请求正文中或
params
中? IE。:
const user = await User.findByPk(req.params.userId);
如果用户 id 在参数中,我认为您还需要将
route
更新为:
routes.put('/users/:userId', UserController.update);
此外,我认为将异步内容包装到 try catch 块中是一种很好的做法。像这样:
try {
const user = await User.findByPk(req.params.userId);
} catch (err) {
console.log(err)
}
关于node.js - Node /更新/API/序列化 : UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'email' of null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66934844/
我正在阅读 Python 文档以真正深入了解 Python 语言,并遇到了 filter 和 map 函数。我以前使用过过滤器,但从未使用过映射,尽管我在 SO 上的各种 Python 问题中都见过这
当我尝试打印 BST 的级别顺序时,这个问题提示了我。 这是一个 Pre-Order Sequence: 4, 1, 2, 3, 5, 6, 7, 8 In_order Sequence : 1, 2
我的代码在 main(序列测试;)的第一行出现错误,指出它是对 sequence::sequence() 的 undefined reference 。我无法更改 main 中的代码。有谁知道我该如何
这可能很简单,但我在通常的 latex 指南中找不到任何相关内容。在这句话中: {\em hello\/} “\/”的目的是什么? 最佳答案 这就是所谓的斜体校正。其目的是确保斜体文本后有适当的间距。
当我从 Postgresql 表中删除所有记录,然后尝试重置序列以在插入时开始一个编号为 1 的新记录时,我得到不同的结果: SELECT setval('tblname_id_seq', (SELE
在版本10.0.3中,MariaDB引入了一种称为序列的存储引擎。 其ad hoc为操作生成整数序列,然后终止。 该序列包含正整数,以降序或升序排列,并使用起始,结束和递增值。 它不允许在多个查询中
如何在 Groovy 中获取给定数字的序列,例如: def number = 169 // need a method in groovy to find the consecutive number
基本上,如果这是 .NET,它看起来像这样: ISomething { string A { get; } int B { get; } } var somethings = new List
说以下代码部分(同一块): A <= 1 A <= 2 变量 A 总是被赋值为 2 吗?还是会出现竞争条件并分配 1 或 2? 我对非阻塞赋值的理解是,由硬件在 future 分配变量 A,因此它可能
在运行 WiX 设置时,我正在寻找操作列表及其顺序。不知何故,官方网站似乎没有提供任何信息。 基本问题是我想正确安排我的自定义操作。通常我需要使用 regsvr32.exe 注册一个 DLL,而这只能
F#初学者在这里 我想创建一个类型,它是具有至少一个元素的另一种具体类型(事件)的序列。任何其他元素都可以在以后随时添加。通常在 C# 中,我会创建一个具有私有(private) List 和公共(p
作为构建过程和不断发展的数据库的一部分,我试图创建一个脚本,该脚本将删除用户的所有表和序列。我不想重新创建用户,因为这将需要比所允许的更多的权限。 我的脚本创建了一个过程来删除表/序列,执行该过程,然
我想恢复两个向量的第一个日期和相同向量的第二个日期之间的日期序列,.... 这是一个例子: dates1 = as.Date(c('2015-10-01', '2015-03-27', '2015-0
这个问题已经有答案了: sql ORDER BY multiple values in specific order? (12 个回答) 已关闭 9 年前。 我有一个 sql 语句,我想要ORDER
我想恢复两个向量的第一个日期和相同向量的第二个日期之间的日期序列,.... 这是一个例子: dates1 = as.Date(c('2015-10-01', '2015-03-27', '2015-0
在用java编写代码时,我需要用“],[”分割字符串。下面是我的代码。 try (BufferedReader reader = new BufferedReader(new InputStreamR
这个问题已经有答案了: Project Euler Question 14 (Collatz Problem) (8 个回答) 已关闭 9 年前。 我正在尝试查找数字的 Collatz 序列。以下
我有一个例程函数process_letter_location(const char& c, string &word)。 在我的 main 中,我声明了一系列字符串变量,如下所示: string s
我需要找到最长的多米诺骨牌链,给定一组 12 个随机挑选的多米诺骨牌。我已经递归地生成了多米诺骨牌的所有可能性(使用 0 到 12 的面值有 91 种可能性)。多米诺骨牌由一 block “砖 blo
我有这个数据结构 Seq,它继承了类 vector 但有一些额外的功能。使用这个数据结构 Seq 我有这个预定义的数据结构: typedef Seq > MxInt2d; 我现在想要一个包含多个 Mx
我是一名优秀的程序员,十分优秀!