为何Mongoose在ReactJS工作,为什么不能.save?

时间:2016-09-07 17:24:54

标签: javascript node.js mongodb reactjs mongoose

我有一个ReactJS和Redux连接MongoDB,Mongoose。

我有一个Mongoose Schema(user.js)设置如下:

var UserSchema = new Schema({
  email: {
    type: String,
    lowercase: true,
    unique: true,
    required: true
  },
})

接收电子邮件字符串请求的API控制器,然后如果在文本字段中没有输入任何内容,则会发送422错误,而在User.findOne内,如果电子邮件已经存在于数据库中,那么它抛出422错误,如果没有,则user.save将其保存在数据库中。

"use strict";

const User = require('../models/user')

exports.register = function(req, res, next) {
  const email = req.body.email;
  console.log('ERROR 1')

  if(!email) {
    return res.status(422).send({ error: 'You must enter an email address.'})
    console.log('ERROR 1')
  }

  User.findOne({ email: email }, function(err, existingUser) {
    if(err) { return next(err); }
    console.log('ERROR 2')
    if(existingUser) {
      return res.status(422).send({ error: 'That email address is already in use.'})
    }
    console.log('ERROR 3')
    let user = new User({
      email: email,
    })
    console.log('ERROR 4')
    user.save(function(err, user) {
      if(err) { return next(err); }
      console.log('ERROR 5')
      res.status(201).json({
        user: user,
      })
    })
  })
  console.log('ERROR 6')
}

我正在发出POST请求:

export function registerUser({ email }) {
  return function(dispatch) {
    axios.post(`${API_URL}/auth/register`, { email })
    .then(response => {
      console.log('THIS IS TESTING PURPOSE')
      console.log(response)
      dispatch({ type: AUTH_USER });
    })
    .catch((error) => {
      errorHandler(dispatch, error.response, AUTH_ERROR)
    });
  }
}

我发出了几个POST请求,并且所有的状态都从使用服务器配置的{'database': 'mongodb://localhost/practicedb', 'port': process.env.PORT || 3000}的API获得了成功状态,但数据永远不会被保存,数据库(practb)也不会显示在终端上。

似乎所有东西都设置正确,但为什么会出现这个问题呢?我可以错过一些东西吗?任何见解或指导都会非常感激。

提前谢谢!

以下是一些日志以及我从未做过的OPTIONS请求:

enter image description here

尝试再次使用相同的电子邮件注册: enter image description here

1 个答案:

答案 0 :(得分:0)

如果我错了,但你的裸保存方法不是异步,请更正。 Save方法返回一个promise。见http://mongoosejs.com/docs/promises.html

修改

user.save().then(function(doc) {
    if (!doc) { next(new Error('Error while persisting!')); } 
    console.log('ERROR 5');

    res.status(201).json({
        user: doc
    });
});

您还可以使用任何承诺的库(Qbluebird)或使用ES6 Promise来实现此目的。或者使用async。

Q的示例。 未经测试

"use strict";

const User = require('../models/user');
const Q = require('Q'); //add https://github.com/kriskowal/q

exports.register = function(req, res, next) {
  const email = req.body.email;
  console.log('ERROR 1')

  if(!email) {
    return res.status(422).send({ error: 'You must enter an email address.'})
    console.log('ERROR 1')
  }

  var deferred = Q.defer();
  User.findOne({ email: email }, function(err, existingUser) {
    if(err) { return next(err); }
    console.log('ERROR 2')
    if(existingUser) {
      return res.status(422).send({ error: 'That email address is already in use.'})
    }
    console.log('ERROR 3')
    let user = new User({
      email: email,
    })
    console.log('ERROR 4')
    user.save(function(err, user) {
      if(err) { 
          deferred.reject(err);
          return next(err); 
      }
      console.log('ERROR 5')
      deferred.resolve(user); //
    });

    res.status(201).json({
        user: deferred.promise,
      })
  })
  console.log('ERROR 6')
}