当前位置: 首页 > 知识库问答 >
问题:

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

闾丘永春
2023-03-14

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

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

有时什么都没发生,应用程序什么都不做。我正在使用Postman测试post请求。

编辑:正如mikey建议的那样,我删除了Resolve和Reject回调,并处理了内部的一切。save()回调,但现在出现以下错误:

(节点:10964)弃用警告:Mongoose:mpromise(Mongoose的默认promise库)已弃用,请插入您自己的promise库: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时,我收到警告:

弃用警告:open()在mongoose中弃用

但是我在代码中没有使用任何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个答案

邵兴怀
2023-03-14

下面的代码可能会解决您的所有问题

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;
翁宜年
2023-03-14

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

它应该是简单的

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

您可能还想检查user.password是否已定义。

屈晨
2023-03-14

为了解决您的第一个警告,关于mpromise,您可以使用本机Promise(节点版本

mongoose.Promise = global.Promise;

要解决第二个警告,您必须使用useMongoClient留档建议了一种Promise方法:

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));
 类似资料:
  • 问题内容: 我想制作这种形式的通用类: 问题是,我希望T可以是整数或Long,但不能接受Double。因此,仅有的两个可接受的声明将是: 有什么办法吗? 问题答案: 答案是不。至少没有办法使用泛型类型做到这一点。我建议结合使用泛型和工厂方法来执行您想要的操作。 这样可以确保只能创建和实例。尽管您仍然可以声明类型的变量,但它必须为null。

  • 如何设置文本颜色,我将使用setForebackground(color c),但如果我使用它,图像不会被打乱。 有可能使它与JLabel一起工作吗?在修改单元格的线程中设置所需的Jlabel(带有图像或文本),只需设置Valueat(label,row,column);

  • 问题内容: 我创建了两种类型: 我想创建一个包含这两种类型的表。我知道对于由一种类型组成的表,它是: 对于我上面创建的两种类型,有什么方法可以做到这一点? 我尝试做的(错误的)是创建包含前两个的第三种类型: 然后创建表: 但这是行不通的。我收到此错误: 问题答案: 您不能成为的主键,因为唯一的列是两种复合类型和。您不能在子句中访问这些复合类型的基本类型。 您尝试执行的操作在或上有pk约束。 除此以

  • 我有一个带参数的函数。此参数必须是两种接口之一。所以我这样写: 但我收到了以下错误。 以下是接口: 因特拉加: 内溶: 我不知道有什么问题。假设函数的参数可以有两种不同的结构。我不知道为什么Tslink会标记它。 提前感谢您的帮助。

  • 其中是我自己的班级。 此方法的返回类型是什么?为什么它似乎有两种返回类型?