我希望从返回的JSON中排除密码字段。我正在使用NestJS和Typeorm。
在这个问题上提供的解决方案不适合我,也不适用于NestJS。如果需要的话,我可以发布我的代码。还有其他的想法或解决方案吗?谢谢。
发布于 2021-05-15 14:55:26
这已经是一个古老的话题了,但我还是想分享我的解决方案,也许它会对某人有所帮助。我使用Express,但我的示例可能也适用于这种情况。
因此,在实体类中,您只需定义一个附加的静态removePassword()方法,该方法接收实体本身的一个实例,然后发送由该方法创建的对象,而不是从DB获得的原始实体对象:
import { Entity, Column, PrimaryGeneratedColumn } from 'typeorm';
@Entity({ name: 'users' })
export class User {
@PrimaryGeneratedColumn('uuid')
id: string | undefined;
@Column({ type: 'varchar', length: 100, unique: true })
email: string | undefined;
@Column({ type: 'text' })
password: string | undefined;
static removePassword(userObj: User) {
return Object.fromEntries(
Object.entries(userObj).filter(([key, val]) => key !== 'password')
);
}
}这基本上就像调用数组上的filter()方法一样,但稍微复杂一点:您可以从条目数组中创建一个新对象(最终将发送的对象),该对象是通过过滤原始条目数组中的密码条目(使用这种精确的filter()方法)生成的。
不过,在您的路由处理程序中,您总是会这样做:
import { Router, Request, Response, NextFunction } from 'express';
import { User } from '../../entity/User';
import { getRepository } from 'typeorm';
const router = Router();
router.post(
'/api/users/signin',
(req: Request, res: Response, next: NextFunction) => {
const { email } = req.body;
getRepository(User)
.findOne({ email })
.then(user =>
user ? res.send(User.removePassword(user)) : res.send('No such user:(')
)
.catch(err => next(new Error(err.message)));
}
);
export { router as signinRouter };您还可以使用常规方法:
withoutPassword() {
return Object.fromEntries(
Object.entries(this).filter(([key, val]) => key !== 'password')
);
}在你的路线处理程序中:
res.send(user.withoutPassword());https://stackoverflow.com/questions/50360101
复制相似问题