Mongoose .save()没有保存到数据库?

时间:2016-09-08 21:32:29

标签: node.js mongodb express reactjs mongoose

我遇到了Mongoose .save方法的问题。数据库永远不会被创建,数据也不会被保存,并且不会抛出任何错误。我已经筋疲力尽了谷歌和stackoverflow看着类似的建议没有运气,所以把它打开给任何可以帮助我的人!

我的POST请求来自:

export function registerUser({ email }) {
  return function(dispatch) {
    axios.post(`${API_URL}/auth/register`, { email })
    .then(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)也不会显示在终端上。

使用Mongoose Schema(user.js):

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

API控制器

接收电子邮件字符串POST请求,然后如果在文本字段中没有输入任何内容,则会发回422错误,而在User.findOne内,如果电子邮件已存在于数据库中,则会抛出422错误,如果没有,user.save将其保存在数据库中。但.save没有错误,数据库甚至无法创建。

"use strict";

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

exports.register = function(req, res, next) {
  const email = req.body.email;

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

  User.findOne({ email: email }, function(err, existingUser) {
    if(err) { return next(err); }

    if(existingUser) {
      return res.status(422).send({ error: 'That email address is already in use.'})
    }
    let user = new User({
      email: email,
    })
    user.save(function(err, user) {
      if(err) { return next(err); }
      res.status(201).json({
        user: user,
      })
    })
  })
}

编辑

我为API控制器尝试了更广泛的控制台日志记录,一旦触发,看起来它没有执行任何操作并跳到最后,但随后它会重新启动并进入User.findOne和user.save ,但看起来像user.save不起作用。

服务器是否未正确连接到数据库?有没有办法确定是否正在使用MongoDB方法?

也尝试过快速记录:

enter image description here

以下是服务器的设置方式:

const express = require('express'),
      app = express(),
      logger = require('morgan'),
      config = require('./config/main'),
      mongoose = require('mongoose'),
      bodyParser = require('body-parser'),
      router = require('./router');

mongoose.Promise = global.Promise;
mongoose.connect(config.database);

const server = app.listen(config.port);
console.log('Your server is running on port ' + config.port + '.');

app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());
app.use(logger('dev'));

app.use(function(req, res, next) {
  res.header("Access-Control-Allow-Origin", "http://localhost:8080");
  res.header('Access-Control-Allow-Methods', 'PUT, GET, POST, DELETE, OPTIONS');
  res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, Authorization, Access-Control-Allow-Credentials");
  res.header("Access-Control-Allow-Credentials", "true");
  next();
})

router(app);

编辑2

enter image description here

2 个答案:

答案 0 :(得分:0)

我遇到了类似的问题并且项目没有显示,因为我没有查看数据库中的正确位置。您确定已连接到mongodb数据库吗? Mongoose有时会进行操作缓冲。试试这个,以确保你连接:

var db = mongoose.connection;
db.on('error', console.error.bind(console, 'connection error:'));
db.once('open', function() {
  // we're connected!
});

// from mongoose docs. 

有关操作缓冲的更多详细信息:http://mongoosejs.com/docs/connections.html

答案 1 :(得分:0)

我实际上花了最后4个小时来弄清楚为什么.save()无法正常工作。原来我的家庭IP地址已更改,无法访问数据库。 ARGH

无论如何...这是我诊断问题的方式:

执行console.log(mongoose.connection.readyState)

该代码将返回数据库状态。如果返回1,则表明您已连接。如果返回0,则表明您尚未连接。 See this answer for the full list

如果返回0,则可以尝试将IP地址列入白名单(假设您使用的是MongoDB Atlas):

  1. 转到您的MongoDB Atlas仪表板。
  2. 转到“安全性”下的Network Access
  3. Add IP Address
  4. 添加您当前的IP地址