Node.js调用自定义模块提示getTemperature is not a function错误如何解决?
问题原因
你遇到的报错是两个问题共同导致的:
- 模块导出导入方式不匹配
你在weather.mjs中使用export default默认导出了getTemperature函数,所以导入时拿到的weather变量本身就是这个函数,不是包含getTemperature方法的对象。你写的weather.getTemperature("MEX")相当于在函数对象上找不存在的getTemperature属性,自然会报「Is not a function」。 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
相关产品推荐
相关产品推荐

