javascript - Passport + Express + Typescript req.user.email indefinido
Bueno, tengo una pregunta similar a esta (sé que es similar a otra). Pero req.user estaba indefinido hasta que instalé @types/passport.
Ahora me surge este problema en VS Code a pesar de que tengo mi instanciación de sesión en mi servidor.
El problema
La instanciación
// 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());
No hay errores arriba. Por lo tanto... la aplicación de hecho funciona... pero recibo este "color de error" en mi archivo de VSC que sería genial evitar. ¿Alguna sugerencia?
Por si acaso, incluiré todo el archivo del enrutador:
// 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);
}
});
La interfaz User (módulo @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;
...
Respuesta #1
Necesitas extender el tipo Express.User:
declare global {
namespace Express {
interface User {
email: string;
}
}
}
Respuesta #2
Creo que todo lo que necesitas hacer es extender la interfaz de tipo User. Eso ya se preguntó en GitHub.
interface User extends SomeOtherUserTypeYouHaveDefined {
email?: string;
alsoAnyOtherPropertyYourCodeSetsOnUser: number;
}
