Strongloop : 在操作挂钩中比较旧模型和新实例 'before save'
Strongloop : Compare old model with the new instance in operation hook 'before save'
我在我的代码中实现了一个 "before save" 操作挂钩,以将要保存的新实例与数据库中已有的旧实例进行比较。
为此,我将 ctx.data 中给出的值与数据库中查询给出的值进行比较。
问题是返回的值总是相似的,就好像新实例已经保存在数据库中一样。
我是否完全错过了 "before save" 钩子的要点,或者有没有办法比较这两个值?
module.exports = function(app) {
var Like = app.models.Like;
Like.observe('before save', function(ctx, next) {
var count = 0;
if (ctx.instance) { // create operation
console.log('create operation);
}
else { // update operation
// Query for the existing model in db
Like.findById(ctx.where.id,
function(err, item) {
if (err)
console.log(err);
else {//compare query value and instance value
if (item.value != ctx.data.value) {
// Always false
}
else {
//Always true
}
}
}
);
}
next();
我不明白为什么 item.value 总是类似于 ctx.data.value 因为第一个应该是数据库中的实际值,第二个应该是将要保存的值.
他们将 next() 放在底部的方式似乎不正确,可能会在 findById
调用 returns 之前为实际发生的保存提供足够的时间。一旦你调用 next
保存就可以实际发生所以 findById
可以与你的保存竞争。
像这样尝试,您的 next()
在 findById
的回调中,这将阻止保存,直到您完成比较。
module.exports = function(app) {
var Like = app.models.Like;
Like.observe('before save', function(ctx, next) {
var count = 0;
if (ctx.instance) { // create operation
console.log('create operation);
next();
}
else { // update operation
// Query for the existing model in db
Like.findById(ctx.where.id,
function(err, item) {
if (err)
console.log(err);
else {//compare query value and instance value
if (item.value != ctx.data.value) {
// Always false
}
else {
//Always true
}
}
next();
}
);
}
我在我的代码中实现了一个 "before save" 操作挂钩,以将要保存的新实例与数据库中已有的旧实例进行比较。 为此,我将 ctx.data 中给出的值与数据库中查询给出的值进行比较。 问题是返回的值总是相似的,就好像新实例已经保存在数据库中一样。 我是否完全错过了 "before save" 钩子的要点,或者有没有办法比较这两个值?
module.exports = function(app) {
var Like = app.models.Like;
Like.observe('before save', function(ctx, next) {
var count = 0;
if (ctx.instance) { // create operation
console.log('create operation);
}
else { // update operation
// Query for the existing model in db
Like.findById(ctx.where.id,
function(err, item) {
if (err)
console.log(err);
else {//compare query value and instance value
if (item.value != ctx.data.value) {
// Always false
}
else {
//Always true
}
}
}
);
}
next();
我不明白为什么 item.value 总是类似于 ctx.data.value 因为第一个应该是数据库中的实际值,第二个应该是将要保存的值.
他们将 next() 放在底部的方式似乎不正确,可能会在 findById
调用 returns 之前为实际发生的保存提供足够的时间。一旦你调用 next
保存就可以实际发生所以 findById
可以与你的保存竞争。
像这样尝试,您的 next()
在 findById
的回调中,这将阻止保存,直到您完成比较。
module.exports = function(app) {
var Like = app.models.Like;
Like.observe('before save', function(ctx, next) {
var count = 0;
if (ctx.instance) { // create operation
console.log('create operation);
next();
}
else { // update operation
// Query for the existing model in db
Like.findById(ctx.where.id,
function(err, item) {
if (err)
console.log(err);
else {//compare query value and instance value
if (item.value != ctx.data.value) {
// Always false
}
else {
//Always true
}
}
next();
}
);
}