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

Express/Node.js项目模块导入报错求助:Cannot use import outside a module

解决你的Express/Node.js模块导入与异步函数调用问题

我来一步步帮你搞定遇到的问题,先从最扎眼的报错说起:

1. 搞定Uncaught SyntaxError: Cannot use import statement outside a module报错

Node.js默认用的是CommonJS模块规范(也就是require/module.exports那套),但你写的是ES模块的import/export语法,所以直接跑会报错。解决起来很简单:

  • 去项目根目录的package.json里加个"type": "module"字段。要是还没package.json,先跑npm init -y生成一个。修改后大概长这样:
{
  "name": "your-project-name",
  "version": "1.0.0",
  "type": "module",
  // 其他原有字段...
}

2. 修正airportQuery.js里的小问题

你的这个文件有两个细节要调整:

  • fetch的导入位置不对,得放在函数前面,不然调用fetch的时候模块还没加载
  • 既然已经用了ES模块,把require("node-fetch")改成ES的import语法

修改后的airportQuery.js:

import fetch from 'node-fetch';

async function getAirports(planeIcao) {
  let airport = { arrival: "", destination: "" };
  // 用模板字符串拼接URL更清晰,也避免字符串拼接的小坑
  const airport_url = `https://opensky-network.org/api/flights/aircraft?icao24=${planeIcao}&begin=1517184000&end=1517270400`;
  
  const response = await fetch(airport_url);
  const data = await response.json();

  // 加个判断,防止数据为空时访问data[0]报错
  if (data && data.length > 0) {
    airport.arrival = data[0].estArrivalAirport;
    airport.destination = data[0].estDepartureAirport;
  } else {
    console.log('没找到对应航班的数据哦');
  }
  
  return airport;
}

export { getAirports };

3. 正确调用异步函数getAirports

getAirports是异步函数,直接console.log(getAirports('3c675a'))只会打印一个Promise对象,拿不到实际的机场数据。你可以用两种方式处理:

方式一:用async/await包裹调用

修改DistanceFormula.js:

import { getAirports } from "./api/airportQuery";

async function fetchAndLogAirports() {
  try {
    const result = await getAirports('3c675a');
    console.log(result);
  } catch (err) {
    console.error('请求出错啦:', err);
  }
}

fetchAndLogAirports();

方式二:用.then()处理Promise

import { getAirports } from "./api/airportQuery";

getAirports('3c675a')
  .then(result => console.log(result))
  .catch(err => console.error('请求出错啦:', err));

关于Node路由的疑问

如果你的最终目标是把这个功能做成API接口(比如让前端通过请求某个URL获取数据),那确实需要在Express里配置路由。给你举个简单的例子:
在项目里新建server.js:

import express from 'express';
import { getAirports } from "./api/airportQuery";

const app = express();
const port = 3000;

// 定义一个GET路由,接收飞机ICAO参数
app.get('/api/airports/:icao', async (req, res) => {
  try {
    const icao = req.params.icao;
    const airports = await getAirports(icao);
    res.json(airports);
  } catch (err) {
    res.status(500).json({ error: '获取数据失败' });
  }
});

app.listen(port, () => {
  console.log(`服务器跑起来啦:http://localhost:${port}`);
});

启动服务器后,访问http://localhost:3000/api/airports/3c675a就能拿到返回的机场数据了。但如果只是单纯测试getAirports函数的功能,暂时不需要路由,先把前面的模块和异步调用问题解决就行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:33:13