【问题标题】:Passport + Express + Typescript req.user.email undefinedPassport + Express + Typescript req.user.email 未定义
【发布时间】:2020-07-13 20:14:16
【问题描述】:

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

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

问题

实例化

// 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 接口(@98​​7654328@ 模块)

// 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 有自己的物业邮箱吗?看起来不是,但您可能可以手动初始化它。默认情况下,它仅包含 usernameid 属性
  • 它没有。但是在@types/passport 模块中定义。我会按照你提到的那样扩展它。

标签: javascript node.js typescript express passport.js


【解决方案1】:

你需要扩展Express.User类型:

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

【讨论】:

    【解决方案2】:

    我认为你需要做的就是扩展基本的User 类型接口。 GitHub 上已经有人问过了。

    interface User extends SomeOtherUserTypeYouHaveDefined {
          email?: string;
          alsoAnyOtherPropertyYourCodeSetsOnUser: number;
        }
    

    【讨论】:

    • 是的,但我确实搜索过。我没找到。还是谢谢。
    • 不嘲讽你,因为不好找。只是想提供第一手的贡献者解决方案
    猜你喜欢
    • 2018-03-28
    • 2014-08-08
    • 1970-01-01
    • 2015-03-24
    • 2019-08-13
    • 2018-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多