You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node.js加载本地TensorFlow.js模型报错:仅支持HTTP(S)协议

解决Node环境加载本地TensorFlow.js模型时的Only HTTP(S) protocols are supported报错

为啥会出这个错?

你这问题本质上是两个原因:一是你用了file://协议的路径,但你引入的node-fetch本身不支持file协议;二是你没充分利用@tensorflow/tfjs-node的能力——其实它内置了专门给Node环境用的本地文件读取逻辑,根本不需要额外靠node-fetch来加载本地模型。

一步步修复

  1. 先把导入逻辑理清楚
    @tensorflow/tfjs-node已经包含了tfjs的全部核心功能,完全没必要单独导入@tensorflow/tfjs,重复导入反而容易搞出环境冲突。改完的导入代码应该是这样:

    const tf = require('@tensorflow/tfjs-node');
    // 删掉单独导入@tensorflow/tfjs和node-fetch的代码(本地加载用不上)
    
  2. 用绝对路径加载模型才靠谱
    别用相对的file://models/...这种路径,Node环境下用相对路径很容易出问题。我们可以用Node自带的path模块生成绝对路径,再转成file://格式给tfjs-node用:

    const path = require('path');
    // 生成model.json的绝对路径,__dirname是当前脚本所在的目录
    const modelJsonAbsolutePath = path.resolve(__dirname, 'models/ssd_model/model.json');
    // 转成tfjs-node能识别的file://格式
    const ssd_model_path = `file://${modelJsonAbsolutePath}`;
    // 加载模型
    this.model = await tf.loadLayersModel(ssd_model_path);
    

    要是你用的tfjs-node版本稍新一点,甚至可以直接传绝对路径字符串(不用手动拼file://),不过保险起见还是加上更稳妥。

  3. 老版本的特殊处理
    你的依赖版本有点老(tfjs-node 1.2.3是好几年前的版本了),如果上面的方法不好使,试试用Node专属的加载API tf.node.loadLayersModel:

    const modelJsonAbsolutePath = path.resolve(__dirname, 'models/ssd_model/model.json');
    this.model = await tf.node.loadLayersModel(`file://${modelJsonAbsolutePath}`);
    

最后提个醒

  • 确保你的模型文件(model.json和对应的权重文件)都在指定路径里,而且Node进程有读取这个目录的权限。
  • 要是你非得保留node-fetch,其实也能配置它支持file协议,但真的没必要——tfjs-node已经把本地加载的事情处理得很到位了,完全不用绕这个弯。

内容的提问来源于stack exchange,提问作者BradleyB19

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 14:27:38