【问题标题】:Why isn't .save for Mongoose working in ReactJS?为什么在 ReactJS 中工作的 Mongoose 不使用 .save?
【发布时间】:2017-01-15 12:02:23
【问题描述】:

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

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

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

还有一个API控制器,接收到email字符串请求,然后如果在文本字段中没有输入,它会发送422错误,而在User.findOne里面,如果email已经存在于数据库中,那么它会抛出一个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 请求,所有请求都从 API 返回成功状态,服务器配置为:{'database': 'mongodb://localhost/practicedb', 'port': process.env.PORT || 3000},但数据从未保存,并且数据库 (practicedb) 未显示在终端上。

一切似乎都设置正确,但为什么会出现问题?我会错过什么吗?任何见解或指导将不胜感激。

提前谢谢你!

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

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

【问题讨论】:

  • OPTIONS 请求可能由您使用的请求/AJAX 插件自动完成。或者它可能是由浏览器完成的。这很正常。
  • @Noah Hm 那么数据没有保存到数据库中可能是什么问题?一切似乎都设置正确。
  • 是否为了简洁而省略了var mongoose = require('mongoose'); var Schema = mongoose.Schema;
  • @MarcelDjaman 如果您指的是user.js,那么是的并且已经定义了它们。
  • @Noah 有什么想法吗?仍然没有运气

标签: javascript node.js mongodb reactjs mongoose


【解决方案1】:

如果我错了,请纠正,但您的裸保存方法不是异步的。 Save 方法返回一个承诺。见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 来实现此目的。或者使用异步。

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')
}

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2018-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-25
  • 1970-01-01
  • 2020-10-01
  • 1970-01-01
相关资源
最近更新 更多