我正在学习猫鼬,我正在发出一个简单的帖子请求以将用户添加到我的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);
非常感谢您的帮助,谢谢
下面的代码可能会解决您的所有问题
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;
除非我弄错了,bcrypt.hash()接受3个参数而不是4个。因此,它的回调可能永远不会被触发。
它应该是简单的
bcrypt.hash(user.password, salt, function (err, hash){
if(err) return next(err);
user.password = hash;
next();
});
您可能还想检查user.password
和盐
是否已定义。
为了解决您的第一个警告,关于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));
null
问题内容: 我想制作这种形式的通用类: 问题是,我希望T可以是整数或Long,但不能接受Double。因此,仅有的两个可接受的声明将是: 有什么办法吗? 问题答案: 答案是不。至少没有办法使用泛型类型做到这一点。我建议结合使用泛型和工厂方法来执行您想要的操作。 这样可以确保只能创建和实例。尽管您仍然可以声明类型的变量,但它必须为null。
如何设置文本颜色,我将使用setForebackground(color c),但如果我使用它,图像不会被打乱。 有可能使它与JLabel一起工作吗?在修改单元格的线程中设置所需的Jlabel(带有图像或文本),只需设置Valueat(label,row,column);
问题内容: 我创建了两种类型: 我想创建一个包含这两种类型的表。我知道对于由一种类型组成的表,它是: 对于我上面创建的两种类型,有什么方法可以做到这一点? 我尝试做的(错误的)是创建包含前两个的第三种类型: 然后创建表: 但这是行不通的。我收到此错误: 问题答案: 您不能成为的主键,因为唯一的列是两种复合类型和。您不能在子句中访问这些复合类型的基本类型。 您尝试执行的操作在或上有pk约束。 除此以
我有一个带参数的函数。此参数必须是两种接口之一。所以我这样写: 但我收到了以下错误。 以下是接口: 因特拉加: 内溶: 我不知道有什么问题。假设函数的参数可以有两种不同的结构。我不知道为什么Tslink会标记它。 提前感谢您的帮助。
其中是我自己的班级。 此方法的返回类型是什么?为什么它似乎有两种返回类型?