我正在努力使用Lamda函数配置后端,目前我有完整的堆栈应用程序,并且在本地运行良好。 我还设法部署了mysql服务器(aws rds)和前端页面(S3存储桶),当我尝试部署后端(Lamda函数)时,我对此感到有些困惑。
如果有人可以为我的以下问题提供建议或指导,请多加感谢。
Q1-我已经四处挖掘,可以看到我可以使用export.handler,但是在这里我有two
API调用,我是否需要做两个saperate函数,如果可以的话那我需要上传两个文件中所有其他依赖项的zip文件吗?
Q2-是从Lamda函数连接到rds DB的正确方法,如下所示,我仍然能够执行相同的connect.query commads ....以使用mysql(它是如果我从本地访问aws-rds,当前工作正常)
let connection = mysql.createConnection({
host: "root.cjfdyreioui1.eu-west-2.rds.amazonaws.com", // here i connect to rds aws
user: "root",
password: "abc1234",
database: "join_us",
insecureAuth: true,
});
-我压缩了大约30mb的Backend-code
server.js
的片段(我是否需要保留index.js文件名)
const express = require("express");
const mysql = require("mysql");
const jwt = require("jsonwebtoken");
const auth = require("./verifyTokenExisting");
const authNew = require("./verifyTokenNew");
const cors = require("cors");
const cookieParser = require("cookie-parser");
const pdf = require("html-pdf");
const pdfTemplate = require("./documents/pdfTemplate");
const fs = require("fs");
const app = express();
app.use(express.json());
app.use(cookieParser());
app.use(
cors({
credentials: true, // for cookies
origin: "http://localhost:3000",
optionsSuccessStatus: 200,
})
);
let connection = mysql.createConnection({
host: "root.cjfdyreioui1.eu-west-2.rds.amazonaws.com", // here i connect to rds aws
user: "root",
password: "abc1234",
database: "join_us",
insecureAuth: true,
});
//! when clicked on signin page to verify after signin/
app.post("/api/verifyifloginalready", (req, res) => {
let token = req.cookies.yogaoutlet_access_token;
//
if (!token) {
return res.status(401).end();
}
let decodepayload;
try {
decodepayload = jwt.verify(token, "lllfasdgfdadsfasdfdasfcadsf");
} catch (error) {
if (error instanceof jwt.JsonWebTokenError) {
// if invalid token
res.status(401).end();
} else {
res.status(400).end();
}
}
connection.query("SELECT * FROM users WHERE email=?;", [decodepayload.email], function (err, results) {
res.json(results);
});
});
////! LOGIN & LOGOUT
app.post("/api/newuser", (req, res) => {
let x1 = req.body;
if (req.body.logout === false) {
connection.query("SELECT * FROM users WHERE email=?;", [x1.email], function (err, results) {
if (err) console.log("13333", err);
else {
if (results[0].email && results[0].password) {
if ((results[0].password == x1.password && results[0].userloginStatus == true) || (results[0].password == x1.password && results[0].userloginStatus == null)) {
const payload = { email: results[0].email };
const token = jwt.sign(payload, "lllfasdgfdadsfasdfdasfcadsf");
res.cookie("yogaoutlet_access_token", token, {
maxAge: 25 * 24 * 60 * 60 * 1000,
httpOnly: true, // it will enable on frotend-javascript to not have access to cokkies
});
res.status(200).end();
connection.query(
"UPDATE users SET userloginStatus=? WHERE email=?",
["1", results[0].email],
function (err, results) {
if (err) throw err;
console.log(results);
}
);
} else {
res.json({
data: "invalid password",
});
}
} else res.redirect("http://localhost:3000/about");
}
});
} else {
const payload = { email: req.body.email };
console.log("339x", payload);
const token = jwt.sign(payload, "lllfasdgfdadsfasdfdasfcadsf");
res.clearCookie("yogaoutlet_access_token");
res
.json({
data: "User Logged out",
})
.end();
}
});
答案 0 :(得分:1)
第一季度: 是的,您使用export.handler是因为Lambda需要一个入口点。请参阅此处的AWS Lambda开发人员指南:https://docs.aws.amazon.com/lambda/latest/dg/nodejs-handler.html
但是Lambda无法运行服务器,因此必须修改server.js文件。您还需要其他东西来处理来自客户端的连接。也许API Gateway符合要求。
在部署时,您上传一个ZIP存档:https://docs.aws.amazon.com/lambda/latest/dg/nodejs-package.html
第二季度: 运行使用RDS的Node函数的AWS Lambda并不是我的强项。但是,如果您的服务器连接,执行事务然后迅速断开连接,那应该不是问题。无论如何,如果遇到问题,AWS CloudWatch都会为您提供帮助。