{"id":1071,"date":"2023-03-12T10:28:22","date_gmt":"2023-03-12T02:28:22","guid":{"rendered":"https:\/\/www.appblog.cn\/?p=1071"},"modified":"2023-04-29T11:45:05","modified_gmt":"2023-04-29T03:45:05","slug":"build-nodejs-proxy-server-to-solve-cross-domain-problems","status":"publish","type":"post","link":"https:\/\/www.appblog.cn\/index.php\/2023\/03\/12\/build-nodejs-proxy-server-to-solve-cross-domain-problems\/","title":{"rendered":"\u642d\u5efanodejs\u4ee3\u7406\u670d\u52a1\u5668\u89e3\u51b3\u8de8\u57df\u95ee\u9898"},"content":{"rendered":"<h2>\u521d\u59cb\u5316\u9879\u76ee<\/h2>\n<pre><code>npm init -y<\/code><\/pre>\n<p>\u521b\u5efa\u76ee\u5f55 view \u548c\u6587\u4ef6 app.js\uff0cview\u76ee\u5f55\u4e0b\u5b58\u653e\u9879\u76ee\u6587\u4ef6\uff0c<code>app.js<\/code>\u7528\u6765\u542f\u52a8\u672c\u5730\u670d\u52a1\u548c\u914d\u7f6e\u672c\u5730\u4ee3\u7406<\/p>\n<p><!-- more --><\/p>\n<h2>\u5b89\u88c5\u4f9d\u8d56<\/h2>\n<p>\u5b89\u88c5\u76f8\u5173\u4f9d\u8d56\uff0c\u53ea\u9700\u8981\u4e24\u4e2a\u4f9d\u8d56\u5305\uff0c<code>express<\/code>\u662fWeb\u5f00\u53d1\u6846\u67b6\uff0c<code>http-proxy-middleware<\/code>\u5c31\u662f\u4ee3\u7406\u5e93<\/p>\n<pre><code>npm install express http-proxy-middleware connect-history-api-fallback connect-timeout path yarn -S<\/code><\/pre>\n<h2>\u914d\u7f6e\u4ee3\u7406<\/h2>\n<p>\u7f16\u5199<code>app.js<\/code>\uff0c\u793a\u4f8b\u5982\u4e0b\uff1a<\/p>\n<pre><code class=\"language-javascript\">\/\/ \u5bfc\u5165express\uff0c\u8def\u5f84\u5305\uff0c\u5b50\u8fdb\u7a0b\u4e2d\u7684\u5f02\u6b65\u8fdb\u7a0b\uff0c\u4ee3\u7406\uff0c\u8bbe\u7f6e\u9879\u76ee\u6839\u76ee\u5f55\nconst express = require(&#039;express&#039;)\nconst path = require(&#039;path&#039;)\nconst {exec} = require(&quot;child_process&quot;)\nconst proxyMiddleWare = require(&quot;http-proxy-middleware&quot;)\nconst root = path.join(__dirname, &#039;.\/view&#039;)\n\n\/\/ \u751f\u6210express\u5b9e\u4f8b\uff0c\u914d\u7f6e\u4ee3\u7406\uff0c\u542f\u52a8\u670d\u52a1\nconst app = express();\n\/\/ \u914d\u7f6e\u4ee3\u7406\u8bbe\u7f6e\u9879HOST\u4e3a\u76ee\u6807\u670d\u52a1\u5668\uff08\u5373API\u670d\u52a1\u5668\uff09\uff0cPORT\u4e3a\u542f\u52a8\u670d\u52a1\u7aef\u53e3\nconst { HOST = &#039;http:\/\/192.168.16.28:8080\/&#039;, PORT = &#039;8899&#039; } = {}\nconst proxyOption ={target:HOST, changeOrigoin:true}\napp.set(&#039;port&#039;, PORT);\n\/\/ \u8bbe\u7f6e\u6839\u76ee\u5f55\u4e3a\u9759\u6001\u8d44\u6e90\napp.use(&#039;\/&#039;, express.static(root))\n\/\/ \u4f7f\u7528\u53cd\u5411\u4ee3\u7406\napp.use(&quot;\/api&quot;, proxyMiddleWare(proxyOption))\n\/\/ \u542f\u52a8\u670d\u52a1\napp.listen(app.get(&#039;port&#039;), () =&gt; {\n    let url = `http:\/\/localhost:${app.get(&#039;port&#039;)}`\n    \/\/ \u81ea\u52a8\u6253\u5f00\u9ed8\u8ba4\u6d4f\u89c8\u5668\n    switch (process.platform) {\n        case &quot;darwin&quot;:\n            exec(`open ${url}`);\n        case &quot;win32&quot;:\n            exec(`start ${url}`);\n        default:\n            exec(`open ${url}`);\n    }\n})<\/code><\/pre>\n<pre><code class=\"language-javascript\">var express = require(&quot;express&quot;);\nvar path = require(&quot;path&quot;);\nconst timeout = require(&quot;connect-timeout&quot;);\nconst proxy = require(&quot;http-proxy-middleware&quot;);\nvar app = express();\n\n\/\/ \u8fd9\u91cc\u4ece\u73af\u5883\u53d8\u91cf\u8bfb\u53d6\u914d\u7f6e\uff0c\u65b9\u4fbf\u547d\u4ee4\u884c\u542f\u52a8\n\/\/ HOST \u6307\u76ee\u6807\u5730\u5740\uff08\u5373API\u670d\u52a1\u5668\uff09\n\/\/ PORT \u670d\u52a1\u7aef\u53e3\nconst { HOST = &quot;http:\/\/127.0.0.1:8080&quot;, PORT = &quot;2020&quot; } = process.env;\n\n\/\/ \u53cd\u5411\u4ee3\u7406\uff08\u8fd9\u91cc\u628a\u9700\u8981\u8fdb\u884c\u53cd\u4ee3\u7684\u8def\u5f84\u914d\u7f6e\u5230\u8fd9\u91cc\u5373\u53ef\uff09\n\/\/ eg:\u5c06\/api\/test \u4ee3\u7406\u5230 ${HOST}\/api\/test\n\/\/ proxy \u4e2d\u95f4\u4ef6\u7684\u9009\u62e9\u9879\n\nvar apiProxy = proxy(&quot;\/api&quot;, {\n  target: HOST,\n  pathRewrite: { &quot;^\/api&quot;: &quot;&quot; },\n  secure: false,\n  changeOrigin: true\n});\n\napp.use(apiProxy);\n\n\/\/ \u8d85\u65f6\u65f6\u95f4\nconst TIME_OUT = 30 * 1e3;\n\/\/ \u8bbe\u7f6e\u8d85\u65f6 \u8fd4\u56de\u8d85\u65f6\u54cd\u5e94\napp.use(timeout(TIME_OUT));\napp.use((req, res, next) =&gt; {\n  if (!req.timedout) next();\n});\n\napp.use(require(&quot;connect-history-api-fallback&quot;)());\n\n\/\/ appblog\u4e3a\u9879\u76ee\u76ee\u5f55\napp.use(express.static(path.resolve(__dirname, &quot;appblog&quot;)));\n\napp.get(&quot;*&quot;, function(req, res) {\n  if (req.originalUrl.indexOf(&quot;favicon.ico&quot;)) {\n    res.sendFile(path.resolve(__dirname, &quot;dist&quot;, &quot;favicon.ico&quot;));\n  }\n});\n\n\/\/ \u8bbe\u7f6e\u7aef\u53e3\napp.set(&quot;port&quot;, PORT);\n\napp.listen(app.get(&quot;port&quot;), function() {\n  console.log(`server running @${app.get(&quot;port&quot;)}`);\n});<\/code><\/pre>\n<h2>\u542f\u52a8\u4ee3\u7406<\/h2>\n<p>\u5728\u6839\u6587\u4ef6\u5939\u5185\u6253\u5f00\u63a7\u5236\u53f0\u542f\u52a8\u9879\u76ee<code>node .\/app.js<\/code><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u521d\u59cb\u5316\u9879\u76ee npm init -y \u521b\u5efa\u76ee\u5f55 view \u548c\u6587\u4ef6 app.js\uff0cview\u76ee\u5f55\u4e0b\u5b58\u653e\u9879\u76ee\u6587\u4ef6\uff0cap [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[34],"tags":[],"class_list":["post-1071","post","type-post","status-publish","format-standard","hentry","category-node"],"_links":{"self":[{"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/posts\/1071","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/comments?post=1071"}],"version-history":[{"count":0,"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/posts\/1071\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/media?parent=1071"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/categories?post=1071"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/tags?post=1071"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}