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

Node.js跨端口服务变量共享及import语法错误问题咨询

SyntaxError : Cannot use import statement outside a module

相关文件代码

index.ts

let angle_ne = "Northeast";
export {angle_ne};
export let angle_nw = "Northwest";

index.js

// 以下两行会触发"SyntaxError : Cannot use import statement outside a module"错误。
// import angle_ne from "./index"
// console.log(angle_ne);

const express    = require('express');
const mysql      = require('mysql');
const dbconfig   = require('./database.js');
const connection = mysql.createConnection(dbconfig);
const app = express();

// 配置 =========================
app.set('port', process.env.PORT || 3000);

app.get('/', (req, res) => {
  res.send('Root');
});

app.get('/address', (req, res) => {
  connection.query('SELECT * from address where Faddress like "%SEOUL%"', (error, rows) => {
    if (error) throw error;
    // console.log(angle_ne);
    console.log('Address info from DB : ', rows);
    res.send(rows);
    
  });
});

app.listen(app.get('port'), () => {
  console.log('Express server listening on port ' + app.get('port'));
});

用户问题描述

我在Node.js中开发了关联Google Map API的页面,index.ts包含地图及API相关代码,运行于localhost:5173,点击位置的地址会存入变量并在控制台输出。
同时我在localhost:3000运行连接MySQL的index.js,曾尝试将API与数据库服务放在同一端口但出现异常,因此使用不同端口。
我希望在index.js中使用index.ts变量的值,当前状态下是否可行?若可行需做哪些操作?是否因端口不同导致export/import无法使用?
我期望控制台输出"Northeast",尝试导出导入时触发了"SyntaxError: Cannot use import statement outside a module"错误,最终想用该变量构建数据库查询语句。

问题分析与解决步骤

核心问题说明

  1. 端口不同不是export/import失效的原因:两个服务分别跑在5173和3000端口,属于完全独立的进程,Node.js的模块导入机制仅能在同一个进程内生效,跨进程无法直接用import/export共享变量。
  2. SyntaxError的直接原因:index.js是CommonJS模块(使用require语法),而你尝试用ES模块的import语法,Node.js默认不允许在CommonJS文件中混用import,除非配置文件声明为ES模块。

可行实现方案

要实现两个服务间的变量共享,有两种常用方式:

方式一:统一模块规范(仅适用于同进程场景)

如果后续能将两个服务合并到同一个进程,可按以下步骤操作:

  • 在项目根目录的package.json中添加"type": "module",将整个项目设为ES模块规范;
  • 将index.js改名为index.mjs,或者直接改为.ts文件统一用TypeScript编译;
  • 安装typescript及相关依赖,配置tsconfig.json,将index.ts编译为符合ES模块规范的js文件;
  • 此时可通过import { angle_ne } from './index.js'(路径需对应编译后的文件)导入变量。

注意:若两个服务必须分开跑在不同端口,此方式不适用。

方式二:HTTP接口跨进程传递数据(推荐,适用于不同端口/进程场景)

由于两个服务是独立进程,最可靠的方式是通过接口请求传递数据:

  1. 在5173端口的前端服务(index.ts所在项目)中添加接口,返回angle_ne的值:
// 以Vite框架为例,添加自定义API路由
import { createServer } from 'vite';

const server = await createServer({
  // 原有项目配置
});

// 新增接口返回angle值
server.middlewares.use('/get-angle', (req, res) => {
  // 若angle_ne是动态变化的,需从状态管理工具或存储中取最新值
  res.end(JSON.stringify({ angle_ne: "Northeast" }));
});

await server.listen(5173);
  1. 在index.js的服务中,通过HTTP请求获取该值:
const express    = require('express');
const mysql      = require('mysql');
const dbconfig   = require('./database.js');
const connection = mysql.createConnection(dbconfig);
const axios = require('axios'); // 先执行npm install axios安装依赖
const app = express();

// 配置 =========================
app.set('port', process.env.PORT || 3000);

app.get('/', (req, res) => {
  res.send('Root');
});

app.get('/address', async (req, res) => {
  try {
    // 请求5173端口的接口获取angle_ne
    const angleRes = await axios.get('http://localhost:5173/get-angle');
    const angle_ne = angleRes.data.angle_ne;
    console.log(angle_ne); // 输出Northeast
    
    // 用变量构建查询语句
    const query = `SELECT * from address where Faddress like "%SEOUL%"`;
    connection.query(query, (error, rows) => {
      if (error) throw error;
      console.log('Address info from DB : ', rows);
      res.send(rows);
    });
  } catch (err) {
    console.error('获取angle失败:', err);
    res.status(500).send('获取数据失败');
  }
});

app.listen(app.get('port'), () => {
  console.log('Express server listening on port ' + app.get('port'));
});

额外注意事项

  • 若index.ts中的angle_ne是用户交互后动态变化的,需将其存入前端状态管理工具(如Vuex、Redux)或localStorage,确保接口返回最新值;
  • 跨端口请求需处理CORS问题,在5173端口的服务中配置允许3000端口的跨域请求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 19:15:31