diff --git a/package-lock.json b/package-lock.json index 85c8c1848..b4ad404ac 100644 --- a/package-lock.json +++ b/package-lock.json @@ -25,6 +25,7 @@ "dotenv": "^8.6.0", "event-stream": "^4.0.1", "express": "^4.16.4", + "express-http-proxy": "^1.6.3", "file-saver": "^2.0.5", "html-webpack-plugin": "^5.3.2", "identity-obj-proxy": "^3.0.0", @@ -9348,6 +9349,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/es6-promise": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" + }, "node_modules/escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", @@ -10561,6 +10567,27 @@ "node": ">= 0.10.0" } }, + "node_modules/express-http-proxy": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/express-http-proxy/-/express-http-proxy-1.6.3.tgz", + "integrity": "sha512-/l77JHcOUrDUX8V67E287VEUQT0lbm71gdGVoodnlWBziarYKgMcpqT7xvh/HM8Jv52phw8Bd8tY+a7QjOr7Yg==", + "dependencies": { + "debug": "^3.0.1", + "es6-promise": "^4.1.1", + "raw-body": "^2.3.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/express-http-proxy/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dependencies": { + "ms": "^2.1.1" + } + }, "node_modules/express/node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -30565,6 +30592,11 @@ "is-symbol": "^1.0.2" } }, + "es6-promise": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" + }, "escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", @@ -31510,6 +31542,26 @@ } } }, + "express-http-proxy": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/express-http-proxy/-/express-http-proxy-1.6.3.tgz", + "integrity": "sha512-/l77JHcOUrDUX8V67E287VEUQT0lbm71gdGVoodnlWBziarYKgMcpqT7xvh/HM8Jv52phw8Bd8tY+a7QjOr7Yg==", + "requires": { + "debug": "^3.0.1", + "es6-promise": "^4.1.1", + "raw-body": "^2.3.0" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "requires": { + "ms": "^2.1.1" + } + } + } + }, "extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", diff --git a/package.json b/package.json index cf821be9b..e6a9b8a2c 100644 --- a/package.json +++ b/package.json @@ -72,6 +72,7 @@ "dotenv": "^8.6.0", "event-stream": "^4.0.1", "express": "^4.16.4", + "express-http-proxy": "^1.6.3", "file-saver": "^2.0.5", "html-webpack-plugin": "^5.3.2", "identity-obj-proxy": "^3.0.0", diff --git a/server.js b/server.js index 6638f4d05..faa393618 100755 --- a/server.js +++ b/server.js @@ -6,53 +6,30 @@ */ import express from "express" -import request from "request" import Config from "./src/Config" -import _ from "lodash" + import cors from "cors" +import proxy from "express-http-proxy" const port = 8000 const app = express() -// Required for ElasticSearch proxy middleware to parse response body as JSON -app.use(express.json()) // handle json data app.use(express.urlencoded({ extended: true })) // handle URL-encoded data app.use(cors()) app.options("*", cors()) -// ElasticSearch proxy middleware -app.post("/api/search/:index/sinopia/_search", (req, res) => { - // Only use the method, path, and body from the original request: method and - // path have already been validated above and the body must be a - // JSON-serializeable entity - - let searchUri = `${Config.indexUrl}/${req.params.index}/sinopia/_search` - if (!_.isEmpty(req.query)) { - const originalUrl = `${req.protocol}://${req.hostname}${req.originalUrl}` - searchUri += new URL(originalUrl).search - } - - request({ - method: req.method, - uri: searchUri, - body: req.body, - json: true, +app.use( + "/api/search", + proxy(Config.indexUrl, { + parseReqBody: false, + proxyReqOptDecorator(proxyReqOpts) { + delete proxyReqOpts.headers.origin + return proxyReqOpts + }, + filter: (req) => req.method === "POST", }) - .on("error", (err) => { - console.error(`error making request to ElasticSearch: ${err}`) - res.status(500).json({ - error: "server error: could not make request to ElasticSearch", - }) - }) - .pipe(res) - .on("error", (err) => { - console.error(`error returning ElasticSearch response: ${err}`) - res - .status(500) - .json({ error: "server error: could not send ElasticSearch response" }) - }) -}) +) app.get("/", (req, res) => { res.sendFile(`${__dirname}/dist/index.html`)