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

Node.js调用自定义模块提示getTemperature is not a function错误如何解决?

问题原因

你遇到的报错是两个问题共同导致的:

  1. 模块导出导入方式不匹配
    你在weather.mjs中使用export default默认导出了getTemperature函数,所以导入时拿到的weather变量本身就是这个函数,不是包含getTemperature方法的对象。你写的weather.getTemperature("MEX")相当于在函数对象上找不存在的getTemperature属性,自然会报「Is not a function」。
  2. getTemperature函数写法存在逻辑错误
    你当前写的getTemperature内部仅定义了一个async (dispatch) => {}箭头函数,既没有执行也没有返回,就算调用方式正确也拿不到温度结果,且你当前场景没有用到dispatch相关能力,完全不需要多套这一层嵌套。
修正方案

1. 修正lib/weather.mjs代码

// Gets the weather of a given location
import fetch from 'node-fetch';

const latLongAirports = [{
        "name": "Madrid",
        "iata": "MAD",
        "lat": 40.49565434242003,
        "long": -3.574541319609411,
    },{
        "name": "Los Angeles",
        "iata": "LAX",
        "lat": 33.93771087455066,
        "long": -118.4007447751959,
    },{
        "name": "Mexico City",
        "iata": "MEX",
        "lat": 19.437281814699613,
        "long": -99.06588831304731,
}]

// 直接声明为async函数,去掉多余的dispatch嵌套,增加判空逻辑避免非法参数报错
export default async function getTemperature (iata){
    const data = latLongAirports.find(el => el.iata === iata);
    if (!data) throw new Error(`未找到IATA代码为${iata}的机场`);
    const url = "http://www.7timer.info/bin/api.pl?lon=" + data.long + "&lat=" + data.lat + "&product=astro&output=json"
    const response = await fetch(url);
    const myJson = await response.json();
    return myJson.dataseries[0].temp2m
}

2. 修正main.js调用代码

async函数返回值为Promise,需要使用await或者.then()获取实际结果:

// 默认导出的内容直接赋值给导入变量,不需要额外访问对象属性
import getTemperature from './lib/weather.mjs'

async function getWeather() {
  try {
    const temperature = await getTemperature("MEX")
    console.log("墨西哥城当前温度:", temperature)
  } catch (err) {
    console.error("获取温度失败:", err.message)
  }
}

getWeather()
自定义Node.js ES模块声明使用规范
  • 导出分为两种类型,注意和导入方式对应:
    • 默认导出:一个模块仅能有一个export default,导入时不需要加花括号,导入名称可自定义,写法为import 自定义名称 from '模块路径'
    • 命名导出:一个模块可以有多个命名导出,写法为export const xxx = .../export function xxx() {},导入时需要加花括号,名称必须和导出名一致,也可以通过as起别名
  • 涉及异步IO的函数建议声明为async,调用时必须通过await/.then()获取返回值,避免直接拿到Promise对象
  • 导出的公共函数建议增加参数校验、异常抛出逻辑,方便调用方定位问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 23:27:00