mongoose.save()有两种类型的行为

时间:2017-07-17 18:51:55

标签: node.js mongodb mongoose

我正在学习mongoose,我正在做一个简单的帖子请求,将用户添加到我的mongolab测试数据库中。我使用的是基本用户模式,但是当我运行save()方法时,我有时会得到一个

  

未处理的承诺拒绝(拒绝ID:1):错误:数据和盐   需要参数

有时没有任何事情发生,应用程序根本什么都不做。我使用Postman来测试帖子请求。

编辑:正如mikey建议我删除了Resolve和Reject回调并处理了.save()回调中的所有内容,但现在我收到以下错误:

  

(node:10964)DeprecationWarning:Mongoose:mpromise(mongoose' s   不推荐使用默认承诺库,插入您自己的承诺   而是库:http:// mongoosejs.com/docs/promises.html

var express = require('express');
var morgan = require('morgan');
var mongoose = require('mongoose');
var bodyParser = require("body-parser");

var mPromise = require("mpromise");

var User = require('./models/user');

var app = express();


mongoose.connect('mongodb://root2:1234@ds161742.mlab.com:61742/ecommerce', function (err) {
    if (err) console.log(err);

    console.log("Connected to the database");
});

app.use(morgan('dev'));

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));

app.post("/create-user", function (req, res, next) {

    var user = new User();

    user.profile.name = req.body.name;
    user.password = req.body.password;
    user.email = req.body.email;

    user.save(function (err, user) {
        if (err) {
            res.send("deu erro");
        } else {
            console.log("Deu bom");
            res.send("deu bom");
        }
    })
})


app.get("/get-users", function (req, res, next) {
    User.find({})
        .exec(function (err, users) {
            if (err) res.send("Erro na hora de pegar os usuarios " + err);
            res.send(users);
        });
});



app.get('/', function (req, res) {
    res.send("Deu mais bom");
});



app.listen(80, function (err) {
    if (err) throw err;
    console.log("Server is running on port 80");
});

当我连接到mongolab时,我收到警告:

  

弃用警告:在{mongoose> = 4.11.0中弃用open(),请使用   而是openUri(),或者如果使用useMongoClientconn ect()则设置createConnection()选项。看到   http://mongoosejs.com/docs/connections.html#use-mongo-client服务器是   在端口80上运行Db.prototype.authenticate方法将不再是   可以在下一个主要版本3.x中使用,因为MongoDB 3.6只允许   对admin db中的用户进行身份验证,不再允许多个   套接字上的凭据。请使用MongoClient.connect进行身份验证   使用身份验证凭证。

但是我没有在我的代码中使用任何open()方法,因为我没有使用默认的mongoDB库。我能够在mongolab数据库中添加一个集合,但数据不完整,现在我正在努力解决这个问题。

Edit2 :以下是使用bcrypt的UserSchema的代码:

var mongoose = require('mongoose');
var bcrypt = require('bcrypt');
var Schema = mongoose.Schema;

/* The user schema attributes/fields */
var UserSchema = new Schema ({
    email : String,
    password: String,




    profile: {
        name: {type: String, default: "Sem nome"},
        picture: {type: String, default: ''}
    },

    address: String,
    history: [{
        date: Date,
        paid: {type: Number, default: 0},
        //item: { type: Schema.Types.ObjectId, ref: ''}
    }]
});

/* The method to hash the password before saving it to the database */

UserSchema.pre('save', function(next){
    var user = this;
    if(!user.isModified('password')) return next();

    bcrypt.genSalt(10, function(err, salt){
        if(err) return next(err);

        bcrypt.hash(user.password, salt, null, function(err, hash){
            if(err) return next(err);
            user.password = hash;
            next();
        });
    });
});


/* Compare the password between the database and the input from the user */

UserSchema.methods.comparePasswords = function(inputpassword){
    return bcrypt.compareSync(inputpassword, this.password);
}


module.exports = mongoose.model('User', UserSchema);

感谢任何帮助,谢谢

3 个答案:

答案 0 :(得分:1)

要解决关于mpromise的第一个警告,您可以通过以下方式使用原生Promise(节点版本> = 6):

mongoose.Promise = global.Promise;

要解决第二次警告,您必须使用useMongoClient,而documentation建议采用承诺方式:

function connectDatabase(databaseUri) {
    var promise = mongoose.connect(databaseUri, {
        useMongoClient: true,
    });

    return promise;
}

connectDatabase('mongodb://root2:1234@ds161742.mlab.com:61742/ecommerce')
  .then(() => console.log("Connected to the database");)
  .catch((err) => console.log(err));

答案 1 :(得分:0)

除非我弄错了,bcrypt.hash()接受3个参数而不是4.因此,它的回调可能永远不会被解雇。

应该只是

bcrypt.hash(user.password, salt, function (err, hash){
    if(err) return next(err);
    user.password = hash;
    next();
});

您可能还想检查user.password and salt are defined

答案 2 :(得分:0)

以下代码可以解决您的所有问题

var mongoose = require('mongoose');
    var options = {
        useMongoClient:true
    };
    var dbUrl = 'mongodb://root2:1234@ds161742.mlab.com:61742/ecommerce';

    mongoose.connect(dbUrl,options);
    mongoose.Promise = global.Promise;