typescript TypeError:无法读取Expressjs中未定义的属性(阅读“id”)

vpfxa7rd  于 2023-01-31  发布在  TypeScript
关注(0)|答案(1)|浏览(122)

我正在expressjs中开发一个register函数,但由于某种原因,返回了以下消息:

TypeError: Cannot read properties of undefined (reading 'id')

这是我的模型:Users.ts

interface UserAttributes {
  id: number;
  first_name: string;
  last_name: string;
  password: string;
  email:string;
  token: string;
  description?: string;
  createdAt?: Date;
  updatedAt?: Date;
  deletedAt?: Date;
}

'use strict';
const {
  Model, Optional
} = require('sequelize');
module.exports = (sequelize, DataTypes) => {
   class Users extends Model<UserAttributes> {
    public id!: number;
    public first_name!: string;
    public last_name!:string;
    public email!: string;
    public password!: string;
    public token!: string;

  // timestamps!
    public readonly createdAt!: Date;
    public readonly updatedAt!: Date;
    public readonly deletedAt!: Date;

    static associate(models) {
      // define association here
    }
  }
  Users.init({
    id: {
      type:DataTypes.INTEGER,
      primaryKey:true
    },
    password: DataTypes.STRING,
    firstName: DataTypes.STRING,
    lastName: DataTypes.STRING,
    token: DataTypes.STRING,
  }, {
    sequelize,
    modelName: 'Users',
    tableName:'users',
  });
  return Users;
};

这是寄存器控制器:

async function Register (req:Request, res:Response): Promise<Response> {
  try {
    const {id, first_name, last_name, email, password, token} = req.body;
    await Users.find(email);
    const encrypt: typeof Users = await bcrypt.hash(password, 10);
    const user: typeof Users  = await Users.create({first_name, last_name, email: email.toLowerCase(), password: encrypt});
    const Token: typeof Users = await jwt.sign({user_id: user.id?.toString(), email:user.email}, process.env.TOKEN_SECRET);
    user.token = Token;
    return res.status(200).json(user);
  } catch (error) {
    console.error('User couldnt be registered', error);
  }
};

错误消息如下:TypeError: Cannot read properties of undefined (reading 'id')
如果有人能告诉我代码出了什么问题,我会非常感激的。
谢谢祝你今天愉快。

z9smfwbn

z9smfwbn1#

错误消息"类型错误:无法读取undefined的属性(读取"id")"可能是由以下代码行引起的:

const Token: typeof Users = await jwt.sign({user_id: user.id?.toString(), email:user.email}, process.env.TOKEN_SECRET);

Users.create方法返回的user对象似乎是undefined,因此user.id属性也未定义,无法访问。
您可以尝试通过添加console.log语句来调试这个问题,以便在create方法调用之后打印user的值。
另一个问题是以下代码行

await Users.find(email);

应该是

await Users.findOne({ where: { email } });

find方法在sequelize中不可用。
另外,在Users.init中,您定义了firstName、lastName,但在Register函数中使用的是first_name、last_name。
应该确保向create方法传递正确的值,并且create方法返回一个非未定义的对象。

相关问题