护照 + Express + Typescript req.user.email 未定义

8

我有一个类似于这个的问题(我知道这与另一个问题相似)。但是在我安装@types/passport之前,req.user是未定义的。

现在,尽管我已经在服务器上实例化了我的会话,但我在VS Code中遇到了这个问题。

问题

The problem

实例化

// Middlewares
app.use(bodyParser.urlencoded({ extended: false }));
app.use(logger(process.env.NODE_ENV === 'development' ? 'dev' : 'combined'));
app.use(express.json());
app.use(session({
    secret: process.env.NODE_ENV === 'development' ? process.env.SESSION_SECRET : 'secret',
    resave: false,
    saveUninitialized: true
}));
app.use(passport.initialize());
app.use(passport.session());

以上没有任何错误。因此... 应用程序实际上是可以工作的... 但是我在我的VSC文件上获得了这个“错误颜色”,希望能够避免。有什么建议吗?

以防万一,我会包含整个路由器文件:

// POST - Crear usuario
router.post('/', async (req: Request, res: Response) => {
    const resultado: IResultado = {
        data: null,
        ok: false
    };
    const messages: Array<object> = [];
    const datos: IUsuario = req.body;

    // Validación de campos
    if (!validator.isEmail(datos.email)) {
        messages.push({ email: 'El correo electrónico es inválido'});
    }

    if (validator.isLength(datos.password, { max: 5})) {
        messages.push({ password: 'La contraseña debe tener como mínimo seis caracteres' });
    }

    if (!validator.isMobilePhone(datos.telefono, ['es-UY'])) {
        messages.push({ telefono: 'El número de teléfono es inválido' });
    }

    if (!empty(messages)) {
        resultado.message = 'No se pudo crear el usuario';
        resultado.messages = messages;
        return res.json(resultado);
    }

    datos.password = await bcrypt.hash(datos.password, 10);
    datos.fechaCreacion = Date.now();
    datos.fechaActualizacion = Date.now();

    if (req.user && req.user) {
        datos.propietario = req.user.email;
    }

    const ref: any = db.collection('usuarios').doc(datos.email);

    const doc = await ref.get();

    if (doc.exists) {
        // Usuario ya existe
        resultado.message = 'El correo electrónico ya está en uso';
        return res.json(resultado);
    }
    try {
        await ref.set(datos);
        delete datos.password;
        resultado.message = 'Usuario creado correctamente';
        resultado.data = datos;
        resultado.ok = true;
        return res.json(resultado);
    } catch(error) {
        resultado.message = 'No se pudo crear el usuario';
        resultado.error = error;
        console.log(error);
        return res.status(500).json(resultado);
    }
});

User接口(@types/passport模块)

// tslint:disable-next-line:no-empty-interface
        interface AuthInfo {}
        // tslint:disable-next-line:no-empty-interface
        interface User {}

        interface Request {
            authInfo?: AuthInfo;
            user?: User;
...

你确定 user 有一个叫做 email 的属性吗?看起来好像没有,但也许你可以手动初始化它。默认情况下,它只包含 usernameid 属性。 - Adrian Solarczyk
它并不是独立存在的,而是定义在@types/passport模块中。我会按照你提到的进行扩展。 - Maramal
2个回答

19

你需要扩展 Express.User 类型:

declare global {
  namespace Express {
    interface User {
      email: string;
    }
  }
}

这段代码应该放在哪里?我在这里有类似的问题:https://stackoverflow.com/questions/72340135/property-admin-does-not-exist-on-type-user-ts2339?noredirect=1#comment127798285_72340135 - Hasani
一个小提示:如果你的ts文件不是一个模块,你需要这样写:declare namespace Express { interface User { email: string; } } - undefined

3
我认为你所需要做的就是扩展基本的User类型接口。这已经在GitHub上被要求了。
interface User extends SomeOtherUserTypeYouHaveDefined {
      email?: string;
      alsoAnyOtherPropertyYourCodeSetsOnUser: number;
    }

是的,但我确实搜索过了。我没有找到。无论如何还是谢谢。 - Maramal
1
不是在嘲笑你,因为找到它并不容易。只是想提供第一手的贡献者解决方案。 - Adrian Solarczyk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接