浏览器端JS获取Alcor数据报Failed to resolve module specifier错误
问题描述
我是JavaScript初学者,希望通过JS获取WAX游戏加密货币公链上Alcor交易所的数据,参考官网提供的示例代码编写逻辑时遇到了问题。
官网明确标注以下代码未经过测试,仅作解释说明用途,给出的基础初始化代码如下:
import fetch from 'node-fetch' import { Api, JsonRpc, RpcError } from 'eosjs' const rpc = new JsonRpc('https://wax.greymass.com', { fetch })
从链上表格获取买盘订单簿的代码段如下:
// Get buy orderbook from table const { rows } = await rpc.get_table_rows({ code: 'alcordexmain', table: 'buyorder', limit: 1000, scope: 29, // Market id from /api/markets key_type: 'i128', // we are using it for getting order sorted by price. index_position: 2 })
遇到的具体问题:
- 最初因JSHint版本问题出现校验异常,已将JSHint升级至版本9,但代码中
await关键字仍被标红,提示需要在其后添加分号,添加分号后又触发了大量新的校验错误。 - 目前项目可在浏览器中打开,但无法正常获取数据,浏览器控制台抛出如下错误:
Uncaught TypeError: Failed to resolve module specifier "node-fetch". Relative references must start with either "/", "./", or "../".
- 已查阅过该报错的相关解决帖子,但所有方案均提到需要修改JSON配置文件,当前项目仅包含
index.html和对应的JS文件,没有相关配置文件,不清楚解决路径。
问题根因与解决方法
根因
官网给出的示例是Node.js服务端环境的代码,不能直接在无打包工具的纯浏览器静态页面环境下运行:
node-fetch是Node.js端的第三方fetch实现包,浏览器本身自带全局原生fetchAPI,不需要额外导入该包,直接写import fetch from 'node-fetch'会触发模块解析错误。- 纯静态页面没有npm依赖安装、构建打包的流程,不能直接用
import语法导入npm安装的eosjs包。 - 顶层
await仅在ES模块环境下支持,普通脚本里直接写await会触发语法校验错误、运行错误。
具体修改步骤
- 删掉
import fetch from 'node-fetch'这行代码,浏览器环境下fetch是全局内置API,可直接调用。 - 不要用npm导入的方式引入eosjs,直接下载eosjs的浏览器兼容构建版本到你的本地项目目录,在
index.html中用相对路径引入即可,示例引入写法:<script src="./eosjs-api.min.js"></script> - 调整eosjs初始化逻辑,本地脚本引入后eosjs相关对象会挂载到全局,不需要写import语句,初始化代码改为:
const { JsonRpc } = eosjs; const rpc = new JsonRpc('https://wax.greymass.com', { fetch }); - 修复
await的语法问题:把所有调用rpc异步方法的逻辑包裹在async立即执行函数中,避免顶层await的语法报错:(async () => { const { rows } = await rpc.get_table_rows({ code: 'alcordexmain', table: 'buyorder', limit: 1000, scope: 29, key_type: 'i128', index_position: 2 }) // 在这里处理返回的订单簿数据 console.log(rows) })() - 修复JSHint校验报错:在JS文件最顶部加一行配置注释,开启高版本ES语法支持,就不会乱报await相关的错误,也不需要随意添加分号:
// jshint esversion: 11
内容的提问来源于stack exchange,提问作者ArtemProVR
相关产品推荐
相关产品推荐

