我有一个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请求:
答案 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
});
});
您还可以使用任何承诺的库(Q,bluebird)或使用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')
}