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
相关产品推荐
相关产品推荐

