AWS -Serverless- Express Как получить предыдущий маршрут - PullRequest
0 голосов
/ 27 мая 2020

У меня есть кнопка экспорта на моем интерфейсе, которая при нажатии отправляет POST на наш Express сервер, чтобы зарегистрировать нажатие кнопки. Это использует маршрут app.post(usagereport). Что я хочу сделать, так это зафиксировать маршрут, на котором находился пользователь, когда он нажал кнопку экспорта. Однако, поскольку код для отправки запроса POST - это собственный маршрут, он всегда возвращает имя этого маршрута только при попытке чего-то вроде req.route.

Я использую API Gateway + Lambda + AWS -Serverless - Express.

Я думал, что могу сохранить что-то вроде req.session.previousRoute в req.session, чтобы захватить последний загруженный пользователем маршрут, а затем вернуть его в код журнала доступа. Однако я не был уверен, будет ли этот подход работать на Lambda или, возможно, есть просто лучший способ справиться с этим.

Вот мой сервер. js (усечено)

// create the server and setup routes
const app = express();
const mysql = require("mysql");

// AWS-Serverless-Express https://github.com/awslabs/aws-serverless-express
const awsServerlessExpressMiddleware = require("aws-serverless-express/middleware");
app.use(awsServerlessExpressMiddleware.eventContext());

//Setup paths to database connection pools
const nawfprojectsDB = require("../lib/naWfProjectsDb.js");
const queries = require("./queries.js");
const accessLog = require("../lib/accessLog.js");

//Setup a timestamp for logging
const timestamp = new Date().toString();

// S3 Data Mitigation is needed when a data set exceeds 5 MB in size.
// This is a restriction of Lambda itself (they say 6 MB but want to ensure we dont ever hit the limit)
const s3DataMitigation = require("../lib/s3DataMitigation.js");

let environment = process.env.NODE_ENV;

app.get("/wg_data", (req, res, callback) => {
  const dataSet = "wg_data";
  nawfprojectsDB.query(queries.wg_data, (err, result) => {
    if (err) {
      console.log(err);
    }
    s3Data(dataSet, res, callback, result);
    console.log(
      timestamp,
      "Returned " + result.length + " rows from  " + dataSet
    );
  });
  accessLog({ dataSet, req });
});

// Usage report everytime export button is clicked
app.post("/usagereport", (req) => {
  const currentPath = dataSet;
  const dataSet = "Data Exported: " + currentPath;
  console.log(timestamp, "Data exported");
  accessLog({ dataSet, req });
});


module.exports = app;

accessLog. js

let nawfprojectsDB = require("./naWfProjectsDb.js");
let queries = require("../routes/queries.js");
let environment = process.env.NODE_ENV;

//Insert data into access_logs table when usageLog is called
const accessLog = ({ dataSet, req }) => {
  // We only want to log access when in beta, gamma, or prod. Not in development.
  if (environment === "development") {
    console.log("No access log as we are in dev");
  } else {
    // req.apiGateway comes from AWS-Serverless-Express - https://github.com/awslabs/aws-serverless-express
    const user = req.apiGateway.event.requestContext.authorizer.principalId;
    let sqlData = [dataSet, user, environment];
    // Run the log_access query using the sqlData above
    nawfprojectsDB.query(queries.log_access, sqlData, (err) => {
      if (err) {
        console.error("MySQL query error: " + err);
      }
      console.log("Access log added for: ", user, " at data set: ", dataSet);
    });
  }
};

module.exports = accessLog;

1 Ответ

1 голос
/ 28 мая 2020

Решил мой собственный вопрос.

Это было решено с помощью express -сессии. Я установил req.session.previousRoute для каждого из своих маршрутов. Затем я могу получить к нему доступ в моем маршруте usagereport.

const { v4: uuidv4 } = require("uuid");
const express = require("express");
const cookieParser = require("cookie-parser");
const session = require("express-session");
const randomString = uuidv4();
let sessionOptions = {
  cookie: {
    secret: randomString,
    maxAge: 269999999999,
  },
  saveUninitialized: true,
  resave: true,
};
// create the server and setup routes
const app = express();

// Add express-session Middleware - https://www.npmjs.com/package/express-session
app.use(cookieParser(randomString)); // Need cookieParser to properly parse our random string into the type of value expected by session
app.use(session(sessionOptions));

// AWS-Serverless-Express - https://github.com/awslabs/aws-serverless-express
const awsServerlessExpressMiddleware = require("aws-serverless-express/middleware");
app.use(awsServerlessExpressMiddleware.eventContext());

app.get("/wg_data", (req, res, callback) => {
  const dataSet = "wg_data";
  const action = "Accessed";
  req.session.previousRoute = dataSet; // This is where we set the previousRoute in session
  nawfprojectsDB.query(queries.wg_data, (err, result) => {
    if (err) {
      console.log(err);
    }
    s3Data(dataSet, res, callback, result);
    console.log(
      timestamp,
      "Returned " + result.length + " rows from  " + dataSet
    );
  });
  accessLog({ dataSet, action, req });
});

// Usage report everytime export button is clicked
app.post("/usagereport", (req) => {
  // Here we grab the previousRoute set in session to see the true place the data was exported from
  const action = "Exported";
  const previousRoute = req.session.previousRoute; // Now when usagereport is triggered, it knows the previous route from the session and uses that here.
  const dataSet = previousRoute;
  console.log(timestamp, "Data exported from ", previousRoute);
  accessLog({ dataSet, action, req });
});
...