Así que estoy haciendo una API de publicación para el registro/registro. Si un usuario se ha registrado con éxito, se le proporcionará un token de acceso para guardarlo en la interfaz. Todo funciona, el nombre de usuario y la contraseña se guardan en la base de datos junto con el token. Pero el token de acceso no regresa. He usado mongoDB como mi base de datos y usé mongoose. Aquí lo que he hecho hasta ahora:
Código editado
const UserModel = require("../models/userModel"); var bcrypt = require("bcryptjs"); const jwt = require("jsonwebtoken"); const registration = async (req, res) => { try { const { email, password } = req.body; if (!(email && password)) { res.status(400).send("All input is required"); } const existingEmail = await UserModel.find({ email: email }); if (existingEmail.length === 0) { const userToken = jwt.sign({ email: email }, process.env.SECRET, { expiresIn: "90d", }); let hashedPassword = await bcrypt.hash(password, 8); const user = await UserModel.create({ email, password: hashedPassword, token: userToken, }); await userRegistration.save(function (err, result) { if (err) { console.error(err); } else { console.log(result); } }); res.json(userToken); } else { res.json("email has already been registered"); } } catch (err) { res.json(err); } }; module.exports = registration;si pruebo la API en Thunder Client en vscode, devuelve {}, un objeto vacío. Por favor dime que he hecho mal?
const existingEmail = await UserModel.find({ email }); Esta línea suya le proporcionará la matriz de todos los usuarios porque la propiedad de email no tiene nada, será como .find({})
Si está verificando si el email insertado por el usuario ya está en su base de datos o no, le sugiero que lo haga así: const existingEmail = await UserModel.find({ email : email});
Esto devolverá el documento con el valor de la propiedad de email igual al correo electrónico que recibió en req.body es decir, email : xyz@gmail.com
Y en esta línea const userToken = jwt.sign({ email }, process.env.SECRET, {expiresIn: "90d",}); Vuelves a cometer el mismo error. El objeto que pasa en la carga útil tiene la propiedad de email , pero no se asigna ningún valor/correo electrónico a esa propiedad. Es como el email : undefined
Aquí, hazlo así jwt.sign({email : email}, process.env.SECRET, {expiresIn: '90d')})
Aparte de lo que se ha mencionado en las otras respuestas, me parece que no le estás dando el token a res.json en ninguna parte.
Su función es devolver el token, pero no creo que vaya a ninguna parte. Debe pasar el token a res.json, no regresar de la función.
Está utilizando await así como .then() , lo que me parece incorrecto. Tienes que usar solo uno de ellos.
Actualización: jwt.sign devuelve una cadena, por lo que userToken contiene una cadena. Le está dando esa cadena a res.json que espera un json. Tienes que pasarle un objeto.
Entonces, cometí un simple error en el código. Estaba tratando de guardar el registro de usuario que no estaba definido. Por eso estaba ocurriendo el error. Debería tener más cuidado con esto.