Express框架中与模型交互的方法是如何挂载到req.user上的?
代码功能解释
你看到的req.user.getCompany()确实是和数据模型交互的数据库查询代码,这个项目采用Sequelize作为ORM(对象关系映射)框架,这段代码的作用是查询当前登录用户归属的公司数据,传入的scope参数指定了两个预定义的查询规则:with_active_users会关联查询公司下的激活用户,order_by_active_users会将查询结果按激活用户排序。
getCompany方法的挂载逻辑
getCompany是Sequelize框架自动生成的关联查询方法,不需要开发者手动挂载,具体生成逻辑分为两步:
- 第一步是模型关联声明:项目的模型层会定义User模型和Company模型的多对一关联关系,核心代码大致如下:
// User模型定义文件 User.belongsTo(models.Company, { as: 'company', foreignKey: 'company_id' }) // Company模型定义文件 Company.hasMany(models.User, { as: 'users', foreignKey: 'company_id' })
只要定义了belongsTo关联,Sequelize就会自动为每个User实例生成get[关联别名]的实例方法,这里关联别名为company,所以生成的方法就是getCompany()。
- 第二步是req.user的生成:项目采用Passport.js做用户身份校验,用户登录成功后,Passport会自动把当前登录用户的Sequelize实例挂载到请求对象
req上,也就是你用到的req.user,因此你可以直接在路由中调用该实例的内置方法执行查询。
内容的提问来源于stack exchange,提问作者Alexander Solonik
相关产品推荐
相关产品推荐

