如何实现两个简单Node应用的相互通信,返回对方提供的响应内容?
实现方案
你之前用redirect不符合需求的核心原因是:redirect是返回302状态码让客户端主动跳转到另一个地址,地址栏会发生变化,本质是两次客户端请求。而需求要求的是当前应用的服务端主动拉取另一个应用的内容,再作为当前请求的响应返回,全程只有一次客户端请求,地址栏不会改变。
以下是基于Express的可行实现:
第一步:安装依赖
两个应用的项目目录下分别执行以下命令安装依赖:
npm install express node-fetch@2
这里选用node-fetch@2版本是因为它兼容CommonJS语法,无需修改项目模块配置,使用更简便。
第一个应用(监听端口3003)完整代码
const express = require('express'); const fetch = require('node-fetch'); const app = express(); // 暴露给第二个应用调用的接口 app.get('/get-app1-text', (req, res) => { res.send('hello from app 1'); }); // 访问根路径时,从第二个应用拉取内容返回 app.get('/', async (req, res) => { try { const response = await fetch('http://localhost:3002/get-app2-text'); const resultText = await response.text(); res.send(resultText); } catch (error) { res.status(500).send('请求第二个应用失败,请确认第二个应用已正常启动'); } }); app.listen(3003, () => { console.log('第一个应用启动完成,监听端口3003'); });
第二个应用(监听端口3002)完整代码
const express = require('express'); const fetch = require('node-fetch'); const app = express(); // 暴露给第一个应用调用的接口 app.get('/get-app2-text', (req, res) => { res.send('hello from app 2'); }); // 访问根路径时,从第一个应用拉取内容返回 app.get('/', async (req, res) => { try { const response = await fetch('http://localhost:3003/get-app1-text'); const resultText = await response.text(); res.send(resultText); } catch (error) { res.status(500).send('请求第一个应用失败,请确认第一个应用已正常启动'); } }); app.listen(3002, () => { console.log('第二个应用启动完成,监听端口3002'); });
效果验证
先启动第二个应用,再启动第一个应用:
- 访问
http://localhost:3003,返回内容为hello from app 2 - 访问
http://localhost:3002,返回内容为hello from app 1
如果你不想引入第三方依赖,也可以用Node内置的http模块替换node-fetch实现服务端请求,逻辑完全一致。
内容的提问来源于stack exchange,提问作者DMUN
相关产品推荐
相关产品推荐

