簡體   English   中英

為什么沒有.save for Mongoose在ReactJS工作?

[英]Why isn't .save for Mongoose working in ReactJS?

我有一個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請求,並且所有狀態都從使用服務器配置的API恢復成功: {'database': 'mongodb://localhost/practicedb', 'port': process.env.PORT || 3000} {'database': 'mongodb://localhost/practicedb', 'port': process.env.PORT || 3000} ,但數據永遠不會被保存,數據庫(practb)不會顯示在終端上。

一切似乎都設置正確,但為什么問題? 我可以錯過一些東西嗎? 任何見解或指導都會非常感激。

先感謝您!

以下是一些日志以及我從未做過的OPTIONS請求:

在此輸入圖像描述

嘗試再次使用相同的電子郵件注冊: 在此輸入圖像描述

如果我錯了,你的裸保存方法不是異步,請更正。 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來實現此目的。 或者使用異步。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM