在 DataviewJS 中通过包装 request 模拟 fetch 制作补丁用于 API 库可以越过同源策略

在 DataviewJS 中调用API库时可能会出现一些难以理解的异常。例如:

Uncaught (in promise) TypeError: Failed to execute 'fetch' on 'Window': Illegal invocation

这有可能是因为同源策略阻止了fetch向API的请求。

在一些情况下可以使用{ mode: "no-cors" }选项忽略。但在服务器执行严格策略的情况下可能收到更加严重的400异常。

幸运的是,在Obsidian中可以利用另一个内置的函数request来越过同源策略。使用下面的代码包装request制成补丁可以注入API库以解决异常。

const api = {} // 通过模块创建的API对象,内部使用fetch发起请求

// 为了规避fetch的同源策略注入补丁代码
api.fetch = function(url, options) {
    return request({ // 通过调用Obsidian中的request越过同源策略
    	url:url,
    	...options
    }).then(resp => {
        return { // 创建对象模拟fetch返回值
        	ok: ture,
    	    json:function () {
    	        return JSON.parse(resp);
    	    },/* 按需添加更多属性 */
        };
    });
}

api.getToken();
2 个赞