在 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();