我想覆盖strongloop中的默认删除操作,并用某种" soft delete"替换它们。它只是设置了一个要删除的标志。我到目前为止得到它,我挂钩了原始操作,并且没有调用next()
函数,操作不允许数据库。但它也没有发送任何响应状态。那么最好的方法是什么,或者发送自定义响应对象?
module.exports = function (Module) {
Module.observe('before delete', function(ctx, next) {
id = ctx.where['id'];
Module.update({id: id}, {deleted: true}, null);
//next(); // don't call next to avoid deleting
});
更新:不是解决方案,但至少会触发API的某些响应:
Module.observe('before delete', function(ctx, next) {
var id = ctx.where['id'];
Module.update({id: id}, {deleted: true}, null);
// dirty method to trigger response
var err = new Error(); // create new error object
err.statusCode = 204; // set response code to empty response
next(err);
});
答案 0 :(得分:1)
修改强> 这是正确的答案:
module.exports = function(Model) {
let app;
Model.once('attached', (a) => {
app = a;
const deleteById = Model.deleteById;
Model.deleteById = (id, options, cb) => {
Model.updateAll({id: id}, {
deletedAt: new Date(),
deletedBy: options.accessToken.userId,
});
cb(null,'deleted')
};
// ...
});
}
在LB2和LB3中,一种方法是使用操作挂钩。在相关的model.js文件中添加:
module.exports = function(Model) {
let app;
Model.once('attached', (a) => {
app = a;
Model.observe('before delete', (ctx, next) => {
Model.findById(ctx.where.id, (err, instance) => {
if (err) {
return next(err);
}
instance.deletedAt = new Date();
// ...
// other modifications to instance
// ...
// save this in the hookState to retrieve it in after delete hook
ctx.hookState.deletedModelInstance = instance;
next();
});
});
Model.observe('after delete', (ctx, next) => {
Model.replaceOrCreate(ctx.hookState.deletedModelInstance,
(err, instance) => {
if (err) {
console.log(
'An error occured while restoring data ' +
'from hookState after delete operation'
);
}
next();
});
});
});
}