我正在学习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()
,或者如果使用useMongoClient
或conn 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);
感谢任何帮助,谢谢
答案 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();
});
答案 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;