使用findOne查找电子邮件是否存在

时间:2019-03-23 21:46:51

标签: node.js mongodb express

我想查找mongodb中是否存在电子邮件,但是当我使用邮递员发送GET request时,我得到了错误响应。

请求:

{
    "email":"myemail@gmail.com"
}

响应:

{
    "message": "Cast to ObjectId failed for value \"email\" at path \"_id\" for model \"User\""
}

这是我的users.controller.js

router.get('/email', getByEmail); // defined route
...
function getByEmail(req, res, next) {
    userService.getByEmail(req.body)
        .then(user => user ? res.json(user) : res.sendStatus(404))
        .catch(err => next(err));
}

这是users.service.js

async function getByEmail({email}) {
    const user = await User.findOne({email}).select('-hash');
    return user;
}

这对我来说毫无意义,因为在我的其他功能(例如用户登录)中,我同样检查电子邮件是否存在,并且可以正常工作。这是登录名:

控制器:

router.post('/authenticate', authenticate);
...
function authenticate(req, res, next) {
    userService.authenticate(req.body)
        .then(user => user ? res.json(user) : res.status(400).json({ message: 'Email or password is incorrect' }))
        .catch(err => next(err));
}

服务:

async function authenticate({ email, password }) {
    const user = await User.findOne({ email });
    if (user && bcrypt.compareSync(password, user.hash)) {
        const { hash, ...userWithoutHash } = user.toObject();
        const token = jwt.sign({ sub: user.id }, config.secret);
        return {
            ...userWithoutHash,
            token
        };
    }
}

编辑:

我发现,当我将请求更改为POST并且还更改函数以返回truefalse(如果对象存在或不存在)时,它可以工作,但是我应该怎么做更改它使其适用于GET请求?

0 个答案:

没有答案