Node.js同服务器端点内发起GET请求的URL及参数传递问题
解决同一Express服务器内端点调用的问题
我来帮你梳理下代码里的问题,以及正确的实现方式:
首先说你遇到的「Unable to determine the domain name」错误原因
你用了https模块,但你的服务器是普通的HTTP服务器(没配置HTTPS证书),而且URL格式不完整——https.get需要带协议、主机、端口的完整URL,不能只写localhost/test或者相对路径。另外,本地测试用http模块就够了,不用https。
然后是参数获取的错误
你用的req.param已经被废弃了,Express里获取GET请求的查询参数,应该用req.query.param(req.query是存储所有GET参数的对象)。
正确的实现方式分两种:
方式1:用HTTP请求调用同一服务器的端点(适合跨服务调用的场景,本地同服务其实没必要)
修正后的代码如下:
const express = require('express'); const app = express(); const http = require("http"); // 换成http模块,因为没配置HTTPS const port = 1337; app.listen(port, () => { console.log('live on port ' + port); }); app.get('/', function(req, res) { // 必须用完整的URL:协议+主机+端口+路径+参数 const url = `http://localhost:${port}/test?param=abcde`; http.get(url, (response) => { let body = ''; // 响应是流,需要拼接数据块 response.on('data', chunk => { body += chunk; }); // 响应结束后处理结果 response.on('end', () => { console.log('从/test拿到的数据:', body); res.send(`主页在这里,从/test获取到的数据:${body}`); }); }).on('error', (err) => { console.error('调用/test出错:', err.message); res.status(500).send('获取/test数据失败'); }); }); app.get('/test', (req, res) => { // 用req.query获取GET参数 const paramValue = req.query.param; console.log('收到的param参数:', paramValue); res.send(paramValue); });
方式2:直接调用处理函数(同服务内最优方案)
其实同个服务器里的端点,没必要发起HTTP请求,直接把/test的逻辑抽成独立函数,在/端点里调用就行,效率更高,还能避免网络错误:
const express = require('express'); const app = express(); const port = 1337; app.listen(port, () => { console.log('live on port ' + port); }); // 把/test的业务逻辑抽成独立函数 function processTestParam(reqQuery) { const paramValue = reqQuery.param; console.log('收到的param参数:', paramValue); return paramValue; } app.get('/', function(req, res) { // 直接调用函数,模拟req.query传入参数 const testResult = processTestParam({ param: 'abcde' }); console.log('从测试逻辑拿到的数据:', testResult); res.send(`主页在这里,从测试逻辑获取到的数据:${testResult}`); }); app.get('/test', (req, res) => { const result = processTestParam(req.query); res.send(result); });
对你问题的直接解答:
- 正确的URL格式:必须是完整的
http://localhost:1337/test?param=abcde(如果配置了HTTPS才用https://); - 参数传递和返回的方式:原来的方式不对,参数要通过
req.query获取,而且处理HTTP响应时要监听流的data和end事件来拼接响应体。同服务内更推荐直接调用处理函数的方式,既高效又避免网络问题。
内容的提问来源于stack exchange,提问作者sigil
相关产品推荐
相关产品推荐

