I am new to express and mongodb... I am trying to use user.findOne({email}) function returns the user with email with await keyword but the node js throws error saying
let user = await User.findOne({ email: req.body.email });
^^^^^
SyntaxError: await is only valid in async function
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 = router
two problems are here:
if you want to use await your callback should be async:
async () => { await ... }
user in your code is referring to promises not use value came from promise. to do so you need to execute the query:
let user = await User.findOne({ email: req.body.email }).exec();
it is also better to use try catch to avoid your application breaks on bad request.
all in all:
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) }
})
Make the callback function asynchronous by using keyword
async (req, res) => {}
You can use await only in async functions.
You can then just write:
(req, res) => {
like
async (req, res) => {.
The other way would be to not use async (but that'd work too), is to use a callback function:
User.findOne({ email: req.body.email }).then((user)=>{ /* Your logic here */})
In general, I prefer to not mix up async/callbacks, so I stick to only use async or only use callbacks :)