uni-app中 uniCloud.interceptObject 不能停止云对象的调用, uniCloud.addInterceptor 却可以?

uni-app中 uniCloud.interceptObject 不能停止云对象的调用, uniCloud.addInterceptor 却可以?

示例代码:

uniCloud.interceptObject({  
    async invoke({  
        objectName, // 云对象名称  
        methodName, // 云对象的方法名称  
        params // 参数列表  
    }) {  
        //token过期  
        if (uniCloud.getCurrentUserInfo().tokenExpired <= Date.now()) {  
            console.log("身份过期,自动跳转至登录页面");  
            uni.showToast({  
                icon: 'error',  
                title: "身份过期,请登录"  
            })  
            uni.navigateTo({  
                url: "/uni_modules/uni-id-pages/pages/login/login-withpwd"  
            })  
            return false  
        }  
        console.log('interceptObject', {  
            objectName, // 云对象名称  
            methodName, // 云对象的方法名称  
            params // 参数列表  
        });  

    },  
    success(e) {  
        console.log(`拦截并执行成功:`, e);  
    },  
    complete() {  

    },  
    fail(e) {  
        console.log(`拦截并执行失败:`, e);  
    }  
})

操作步骤:

  1. 调用云对象
  2. interceptObject的invoke相应请求的预处理

预期结果:

在invoke中 使用 return false 停止云对象的调用

实际结果:

return false 并没有起作用,云对象依然被调用

bug描述:

需求是这样的: 需要在请求云对象时判断用户的token是否过期,过期了,就停止云对象的调用 我看云函数的 uniCloud.addInterceptor是支持在invoke中返回false来停止云函数api调用的,云对象就不行吗?


更多关于uni-app中 uniCloud.interceptObject 不能停止云对象的调用, uniCloud.addInterceptor 却可以?的实战教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

需要抛出错误才会终止执行。

更多关于uni-app中 uniCloud.interceptObject 不能停止云对象的调用, uniCloud.addInterceptor 却可以?的实战教程也可以访问 https://www.itying.com/category-93-b0.html


uni-app 中,uniCloud.interceptObjectuniCloud.addInterceptor 都是用于拦截和处理云函数或云对象请求的机制,但它们在设计上存在一些差异,这导致了它们在使用场景和功能上的不同。

uniCloud.interceptObject

uniCloud.interceptObject 主要是用于拦截对云对象的操作,如创建、读取、更新和删除(CRUD)等。然而,根据官方文档和设计初衷,interceptObject 的主要目的是在请求被发送到云端之前或响应从云端返回之后进行一些预处理或后处理,而不是用于完全阻止请求的执行。

示例代码:

uniCloud.interceptObject('your-cloud-object')
  .beforeRead(async (req, res, next) => {
    // 在这里可以修改请求参数,或者做一些其他处理
    req.query = { ...req.query, additionalField: 'value' };
    next(); // 继续执行后续操作
  })
  .afterRead(async (req, res, next) => {
    // 在这里可以修改响应结果,或者做一些其他处理
    res.result = res.result.map(item => ({ ...item, transformedField: item.originalField + ' transformed' }));
    next(); // 继续执行后续操作
  });

uniCloud.addInterceptor

相比之下,uniCloud.addInterceptor 提供了更灵活的拦截机制,可以用于拦截云函数或云对象的请求,并且有能力完全停止请求的执行。这使得它在某些需要基于条件决定是否继续执行请求的场景中非常有用。

示例代码:

uniCloud.addInterceptor((req, res, next) => {
  if (req.method === 'POST' && req.url === '/your-cloud-function') {
    // 检查某些条件,决定是否继续执行
    const shouldContinue = someConditionCheckerFunction(req.body);
    if (!shouldContinue) {
      return res.status(403).send({ message: 'Request blocked by interceptor' });
    }
  }
  next(); // 如果条件满足,则继续执行请求
});

在上面的代码中,如果 someConditionCheckerFunction 返回 false,请求将被立即阻止,并返回一个 403 状态码和相应的错误信息。

总结

因此,uniCloud.interceptObjectuniCloud.addInterceptor 的主要区别在于拦截的灵活性和是否能够停止请求的执行。如果你需要基于某些条件完全阻止对云对象的请求,uniCloud.addInterceptor 会是更合适的选择。而如果你只是需要在请求前后进行一些处理,而不阻止请求的执行,那么 uniCloud.interceptObject 会更加合适。

回到顶部