Soy nuevo en express y mongodb ... Estoy tratando de usar la función user.findOne ({email}) devuelve al usuario con el correo electrónico con la palabra clave en espera, pero el nodo js arroja un error que dice
let user = await User.findOne({ email: req.body.email }); ^^^^^SyntaxError: await solo es válido en la función asíncrona
const express = require('express'); const User = require("../models/user"); const {body, validationResult} = require("express-validator"); const router = express.Router(); // Listening the request at assigned route router.post('/', [ // Validation array body("name", "Enter name").isLength({ min: 5 }), body("email", "Enter valid email").isEmail(), body("password", "password must not be less than 5").isLength({ min: 5 }) ] , (req, res) => { // Errors in a single json... const errors = validationResult(req) // If there error return the error json... if (!errors.isEmpty()) { return res.status(400).json({ errors: errors.array() }); } // Check if there any user with same email... let user = await User.findOne({ email: req.body.email }); if (user) { return res.status(400).json({ error: "A user with this email already exist..."}); } // Create user... // user = await User.create({ // name : req.body.name, // email : req.body.email, // password : req.body.password // }) // res.json(user) res.send("Successful request...👍"); }) module.exports = routerdos problemas están aquí:
si desea usar await , su devolución de llamada debe ser async :
async () => { await ... }
user en su código se refiere a promesas, no el valor de uso proviene de la promesa. para hacerlo necesitas ejecutar la consulta:
let user = await User.findOne({ email: req.body.email }).exec();
también es mejor usar try catch para evitar que la aplicación se interrumpa por una mala solicitud.
considerándolo todo:
async (req, res) => { // missing async const errors = validationResult(req) if (!errors.isEmpty()) { res.status(400).json({ errors: errors.array() }); // no need for return } try { let user = await User.findOne({ email: req.body.email}).exec(); // missing exec() if (user) { res.status(400).json({ error: "A user with this email already exist..."}); } res.send("Successful request...👍"); } catch (error) { console.log(error) } })Haga que la función de devolución de llamada sea asíncrona usando la palabra clave
async (req, res) => {}Puede usar await solo en funciones asíncronas. Luego puede simplemente escribir: (req, res) => { like async (req, res) => { .
La otra forma sería no usar async (pero eso también funcionaría), es usar una función de devolución de llamada: User.findOne({ email: req.body.email }).then((user)=>{ /* Your logic here */})
En general, prefiero no mezclar asíncrono/devoluciones de llamada, así que me limito a usar solo asíncrono o solo uso de devolución de llamada :)