Node.js 如果存在使用Next.js、Mongoose、MongoDb Atlas和Express的电子邮件,则无法获取正确的状态代码(409)

Node.js 如果存在使用Next.js、Mongoose、MongoDb Atlas和Express的电子邮件,则无法获取正确的状态代码(409),node.js,mongodb,mongoose,next.js,mongodb-atlas,Node.js,Mongodb,Mongoose,Next.js,Mongodb Atlas,我正在构建我的应用程序的登录/注册部分。现在我用它来检查我的收藏中是否有电子邮件 这是我的路线: var router = require('express').Router() var UserModel = require('../models/UserModel') var { body } = require('express-validator'); router .route('/registration') .get(function(req, res) {

我正在构建我的应用程序的登录/注册部分。现在我用它来检查我的收藏中是否有电子邮件

这是我的路线:

var router = require('express').Router()
var UserModel = require('../models/UserModel')
var { body } = require('express-validator');  

router
    .route('/registration')
    .get(function(req, res) {
        console.log(0)
        UserModel.find({}, (err, users) => {
            console.log(1);
            if (err) return res.status(500).send(err)
            console.log(2);
            return res.json(users);
        })
    })
    .post(body('username_email').custom(value => {
        console.log("value ", value);

        console.log(3)
        UserModel.findOne({ 'username_email': value }, (err) => {
            console.log(4);
            if (err) return res.status(409).send(err);

        })

    }), async(req, res, next) => {
        console.log(5)
        try {
            let newUser = new UserModel(req.body);

            let savedUser = await newUser.save();
            console.log(6);
            if (savedUser) return res.redirect('/users/registration?success=true');
            return next(new Error('Failed to save user for unknown reasons'))

        } catch (err) {
            return next(err)
        }

    })

module.exports = router
在前端的组件中,我的
fetch
中有一个函数,如果有错误,它将捕获错误

  handleErrors(response) {
    if (!response.ok) {
      console.log('This email exists!')
      throw Error(response.statusText);
    }
    return response;
  }


  handleSubmit(event) {
    event.preventDefault()

    var { username, password } = this.state

    var mailFormat = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/
    var error = false

    if (!username.match(mailFormat)) {
      this.setState({ usernameError: true })
      error = true
    } else {
      this.setState({ usernameError: false })
    }

    if (password.length <= 8) {
      this.setState({ passwordError: true })
      error = true
    } else {
      this.setState({ passwordError: false })
    }

    console.log(`error ${error}`)
    if (error == false) {
      this.setState({ formError: false, formSuccess: true })
    }


    window.fetch('http://localhost:8016/users/registration', {
      method: 'POST',
      headers: { 'Accept': 'application/json', 'Content-Type': 'application/json' },
      body: JSON.stringify({ username_email: username, password: password })
    })
      .then(this.handleErrors)
      .then(function (response) {
        console.log(`response ${response}`)
        return response.json()
      }).then(function (data) {
        console.log('User created:', data)
      }).catch(function (error) {
        console.log(error);
      });
  }
这就是问题所在吗?节点样式应该有
错误
和回调

        UserModel.findOne({ 'username_email': value }, (err) => {
            console.log(4);
            if (err) return res.status(409).send(err);

        })

    }), async(req, res, next) => {
        console.log(5)
        try {
            let newUser = new UserModel(req.body);

            let savedUser = await newUser.save();
            console.log(6);
            if (savedUser) return res.redirect('/users/registration?success=true');
            return next(new Error('Failed to save user for unknown reasons'))

        } catch (err) {
            return next(err)
        }

    })
更新

我尝试了Nick的解决方案,但我发现:

MongoError: E11000 duplicate key error collection: development.users index: email_1 dup key: { : null }
    at Function.create (/Users/antoniopavicevac-ortiz/Dropbox/developer_folder/hillfinder/node_modules/mongodb-core/lib/error.js:43:12)
    at toError (/Users/antoniopavicevac-ortiz/Dropbox/developer_folder/hillfinder/node_modules/mongodb/lib/utils.js:149:22)
    at coll.s.topology.insert (/Users/antoniopavicevac-ortiz/Dropbox/developer_folder/hillfinder/node_modules/mongodb/lib/operations/collection_ops.js:859:39)
    at handler (/Users/antoniopavicevac-ortiz/Dropbox/developer_folder/hillfinder/node_modules/mongodb-core/lib/topologies/replset.js:1155:22)
    at /Users/antoniopavicevac-ortiz/Dropbox/developer_folder/hillfinder/node_modules/mongodb-core/lib/connection/pool.js:397:18
    at process._tickCallback (internal/process/next_tick.js:61:11)
POST /users/registration 500 312.485 ms - 51
^C
我注意到两件事:

我返回
MongoError:E11000重复密钥错误集合:development.users索引:email_1 dup key:{:null}


哪一个是重复电子邮件的错误,但第一个错误是控制台中的promise已在使用
电子邮件
消息?还有两个问题,我如何从承诺中传递错误状态
“res.status(409).send(err);”

问题是,在验证过程中,您没有返回承诺,因为mongoose调用是异步的。其余代码在验证程序完成之前运行。我评论了你错过报税表的地方

router.route('/registration')
    .get(function(req, res) {
        UserModel.find({}, (err, users) => {
            if (err) res.status(500).send(err)
            res.json(users)
        })
    })
    .post(body('username').custom(value => {      
        return UserModel.findOne({ 'email': value }).then(user => { // Return Promise
          if (user) {
              return Promise.reject('E-mail already in use');
          }
        });
    }), async(req, res, next) => {

        try {
            let newUser = new UserModel(req.body)
            let savedUser = await newUser.save(err => {
              if (err) return res.json({ success: false, error: err })
              return res.json({ success: true })
            })

            if (savedUser) return res.redirect('/users/registration?success=true');
            return next(new Error('Failed to save user for unknown reasons'))
        } catch (err) {
            return next(err)
        }
    })

module.exports = router
更新

只需通读express validator文档。我认为您需要在请求过程中验证错误

var router = require('express').Router()
var UserModel = require('../models/UserModel')
var { body, validationResult } = require('express-validator');  

router.route('/registration')
    .get(function(req, res) {
        UserModel.find({}, (err, users) => {
            if (err) res.status(500).send(err)
            res.json(users)
        })
    })
    .post(body('username').custom(value => {      
        return UserModel.findOne({ 'email': value }).then(user => { // Return Promise
          if (user) {
              return Promise.reject('E-mail already in use');
          }
        });
    }), async(req, res, next) => {
        // Checks for errors in validation
        const errors = validationResult(req);
        if (!errors.isEmpty()) {
          return res.status(422).json({ errors: errors.array() });
        }

        try {
            let newUser = new UserModel(req.body)
            let savedUser = await newUser.save(err => {
              if (err) return res.json({ success: false, error: err })
              return res.json({ success: true })
            })

            if (savedUser) return res.redirect('/users/registration?success=true');
            return next(new Error('Failed to save user for unknown reasons'))
        } catch (err) {
            return next(err)
        }
    })

module.exports = router

嘿,对不起,伙计。上周末我不在城里,所以我没有机会回答你之前的问题。我把我的回答贴在下面。我也更新了你之前帖子上的答案,谢谢尼克!我听说,夏天是一年中最繁忙的时候。我刚刚添加了tan更新。更新了答案。只需通读express validator文档。我认为您需要处理请求中的验证。现在让我知道这是否有效。因为我们正正确地进入第二部分。我认为这应该解决你的整个问题:)
var router = require('express').Router()
var UserModel = require('../models/UserModel')
var { body, validationResult } = require('express-validator');  

router.route('/registration')
    .get(function(req, res) {
        UserModel.find({}, (err, users) => {
            if (err) res.status(500).send(err)
            res.json(users)
        })
    })
    .post(body('username').custom(value => {      
        return UserModel.findOne({ 'email': value }).then(user => { // Return Promise
          if (user) {
              return Promise.reject('E-mail already in use');
          }
        });
    }), async(req, res, next) => {
        // Checks for errors in validation
        const errors = validationResult(req);
        if (!errors.isEmpty()) {
          return res.status(422).json({ errors: errors.array() });
        }

        try {
            let newUser = new UserModel(req.body)
            let savedUser = await newUser.save(err => {
              if (err) return res.json({ success: false, error: err })
              return res.json({ success: true })
            })

            if (savedUser) return res.redirect('/users/registration?success=true');
            return next(new Error('Failed to save user for unknown reasons'))
        } catch (err) {
            return next(err)
        }
    })

module.exports = router