我想在我的用户模型上编写一个“查找或创建”静态方法 - 非常类似于upsert,但预保存挂钩也会运行。
这是我的用户模型:
var Promise = require("bluebird")
var mongoose = require("mongoose");
var bcrypt = Promise.promisifyAll(require('bcrypt-nodejs'));
var Schema = mongoose.Schema;
var userSchema = new Schema({
e: { type: String, required: true, trim: true, index: { unique: true } },
fb: { type: String, required: true },
ap: { type: String, required: true },
f: { type: String, required: true },
l: { type: String, required: true }
});
// Execute before each user.save() call
userSchema.pre('save', function(callback) {
bcrypt.genSaltAsync(5)
.then(function (salt) {
return bcrypt.hash(this.fb, salt, null);
})
.then(function (hash) {
user.fb = hash;
})
.then(function (){
return bcrypt.genSaltAsync(5);
})
.then(function (salt) {
return bcrypt.hash(this.ap, salt, null);
})
.then(function (hash) {
user.ap = hash;
})
.then(function () {
callback();
})
.catch(function (err) {
callback(err);
});
});
module.exports = mongoose.model('User', userSchema);
我希望它能做到这样的事情,但我尝试的任何工作都不起作用:
userSchema.statics.FindOrCreate(function(json) {
return this.findOne({e: json.email}, function(err, user) {
if(err) return err;
if(user) return user;
// return new user
});
});
非常感谢!
答案 0 :(得分:0)
我建议跳过Mongoose并使用async / await和babel使用mongodb-promise。它会更简单,看起来像这样:
// imports, and connect to db
//...
export async function save(user) {
// qry=... upd=...
let salt = await bcrypt.genSaltAsync(10);
// user.hash=
let res = await mongo.update(qry,upd,{upsert:true});
return res;
}
答案 1 :(得分:0)
使用hooks(mongoose middleware):
sed -i -- 's/INDEF/0000/g' *.txt