Node.js 实现跨域访问的简单使用
做毕设的时候写的一个小系统,部署在tomcat,运行在localhost:8080,这个就先作为提供数据的一个服务。
参考别人的例子写了个跨域访问的demo
代码如下:
const http = require('http');
http.createServer((req, resp)=>{
const proxyReq = http.request({
port: 8080,
host: req.headers['host'],
method: req.method,
path: req.url,
headers: req.headers,
});
proxyReq.on('response', (proxyRes) => {
proxyRes.on('data', (data) =>{
resp.write(data, 'binary');
});
proxyRes.on('end', () =>{
resp.end();
});
resp.writeHead(proxyRes.statusCode, proxyRes.headers);
});
req.on('end', ()=>{
proxyReq.end();
});
req.on('data', (data)=>{
proxyReq.write(data, 'binary');
});
}).listen(3000);
当我运行起来的时候,localhost:8080 页面输出了接口返回的数据。但是在localhost:3000控制台报错如下:
Error: getaddrinfo ENOTFOUND localhost:3000 localhost:3000:8080
at GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:57:26)
猜想:host这行(行号:6)会不会是多余的,因为后面端口号重复了localhost:3000:8080,我把这行直接去掉,发现可以了。直接写成localhost或者127.0.0.1也是可以的。
我对这方面也几乎是一点都不了解,控制台打印了下req.headers[‘host’]结果是 localhost:3000,我去百度随便点开一个请求 他的host是www.baidu.com没有端口号,我又打开一个公司做的系统的网址 它的请求的host就是带端口号的。(关于这个我写在总结[1]中)。
express:
const express = require('express');
const request = require('request');
const app = express();
const proxyServer = 'http://localhost:8080';
app.use('/', (req, res) => {
const url = proxyServer + req.url;
req.pipe(request(url)).pipe(res);
});
app.listen(3000);
总结:
[1]q:为什么有的网址带端口号,有的不带?
a: 80的默认不显示。