Node.js运行ubo-core报错snfe.useLists is not a function
问题描述
安装ubo-core依赖包(执行安装命令npm install @gorhill/ubo-core)并导入项目后,无法正常使用StaticNetFilteringEngine实例。
代码文件为ublock.mjs,内容如下:
async function read(path) { return readFileSync(resolve(__dirname, path), 'utf8'); } (async () => { try { const { StaticNetFilteringEngine } = await import('@gorhill/ubo-core'); const snfe = StaticNetFilteringEngine.create(); await snfe.useLists([ read('./lists/badware.txt') .then(raw => ({ name: 'badware', raw })), ]); // Not blocked if (snfe.matchRequest({ originURL: 'https://www.bloomberg.com/', url: 'https://www.bloomberg.com/tophat/assets/v2.6.1/that.css', type: 'stylesheet' }) !== 0) { console.log(snfe.toLogData()); } } catch (error) { console.log(error) } })();
执行node ublock.mjs运行代码后,得到如下报错信息:
"snfe.useLists" is not a function
当前运行环境为NPM 8.12.1、Node.js 14.16.0,代码参照ubo-core官方npm文档中的示例编写。
报错原因
- 核心问题:
StaticNetFilteringEngine.create()是异步方法,调用时未加await,变量snfe实际是一个Pending状态的Promise对象,不是初始化完成的引擎实例,自然不存在useLists方法。 - 运行环境不兼容:当前使用的Node.js 14.16.0版本过低,@gorhill/ubo-core稳定版要求Node.js 18及以上运行环境,低版本对ES2022+标准特性支持不全,即使修正await问题也会触发其他兼容报错。
- 代码存在隐式依赖缺失:
.mjs属于ES Module环境,默认没有CommonJS规范下的__dirname变量,也未导入readFileSync、resolve方法,执行到文件读取逻辑时会抛出引用错误。
修复方案
- 先将Node.js升级到18.x或更高的LTS版本,低版本无兼容适配方案
- 调用
StaticNetFilteringEngine.create()时添加await,等待实例初始化完成后再执行后续操作 - 补全ES Module环境下缺失的模块导入,手动实现
__dirname兼容
修复后的完整可运行代码:
import { readFileSync } from 'node:fs'; import { resolve, dirname } from 'node:path'; import { fileURLToPath } from 'node:url'; const __dirname = dirname(fileURLToPath(import.meta.url)); async function read(path) { return readFileSync(resolve(__dirname, path), 'utf8'); } (async () => { try { const { StaticNetFilteringEngine } = await import('@gorhill/ubo-core'); // 等待引擎实例初始化完成 const snfe = await StaticNetFilteringEngine.create(); await snfe.useLists([ read('./lists/badware.txt') .then(raw => ({ name: 'badware', raw })), ]); if (snfe.matchRequest({ originURL: 'https://www.bloomberg.com/', url: 'https://www.bloomberg.com/tophat/assets/v2.6.1/that.css', type: 'stylesheet' }) !== 0) { console.log(snfe.toLogData()); } // 释放引擎占用资源 snfe.dispose(); } catch (error) { console.log(error) } })();
内容的提问来源于stack exchange,提问作者Niels
相关产品推荐
相关产品推荐

