AWS-Serverless-Express如何获取上一条路线

时间:2020-05-27 16:01:28

标签: node.js amazon-web-services express aws-lambda aws-serverless

我的前端有一个导出按钮,单击该按钮时,会在我们的Express服务器上发送POST记录该按钮的单击。这使用路由app.post(usagereport)。我想要做的是捕获用户单击“导出”时所处的路线。但是,由于发送POST请求的代码是它自己的路由,因此只有在尝试使用req.route之类的命令时,它才会返回该路由的名称。

我正在使用API​​网关+ Lambda + AWS-Serverless-Express。

我当时想我可以在req.session中存储类似req.session.previousRoute的内容,以捕获用户加载的最后一条路由,然后将其返回给访问日志代码。但是,我不确定这种方法是否适用于Lambda,或者也许只有更好的方法来处理它。

这是我的server.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 个答案:

答案 0 :(得分:1)

解决了我自己的问题。

解决此问题的方法是使用Express-Session。我在每条路线中都设置了Nan::To<bool>(info[0]).FromJust()。然后,我可以在req.session.previousRoute路由中访问它。

usagereport