Skip to content

Instantly share code, notes, and snippets.

@WoonHaKim
Last active March 7, 2022 00:25
Show Gist options
  • Save WoonHaKim/8b90a9094b30ddd1de8011e70085715a to your computer and use it in GitHub Desktop.
Save WoonHaKim/8b90a9094b30ddd1de8011e70085715a to your computer and use it in GitHub Desktop.
Serverless + sls-http + koa example
// written typescript
import { APIGatewayEvent, Context, Handler } from "aws-lambda";
import Koa from "Koa";
import Router from "koa-router";
import serverlessHttp from "serverless-http";
// for serverless offline
export interface SlsExtendableOfflineEvent extends APIGatewayEvent {
isOffline?: boolean;
}
const app = new Koa();
const router = new Router({ prefix: "/prefix" });
// set simple server middleware or use koa-logger
app.use(async (ctx, next) => {
try {
console.log(`(${ctx.method})[${ctx.url}] Requested`);
ctx.set("Access-Control-Allow-Credentials", "true");
ctx.set(
"Access-Control-Allow-Origin",
"some cors access domain"
);
await next();
} catch (err) {
ctx.status = err.status || 500;
ctx.body =
process.env === "development" ? err.message : "internal server error"
ctx.app.emit("error", err, ctx);
}
});
app.on("error", (err, ctx) => {
console.error(`(${ctx.method})[${ctx.url}] Got An Error:`, err, ctx);
console.error(err.stack);
});
router.get("/", async ctx => {
// Some business logic
ctx.status = 200;
ctx.body = "get success";
});
app.use(router.routes());
const slsApp = serverlessHttp(app, {
request(req: Koa.SlsHttpIncomingMsg, event: SlsExtendableOfflineEvent) {
if (!event.isOffline) {
// remove CDN Prefix if exists, for sls-offline (ex. /route/prefix)
const cdnPrefix = req.url.split(this.prefix)[0];
req.url = req.url.replace(cdnPrefix, "");
}
// pass lambda's requestContext for auth, etc.
req.context = event.requestContext;
}
});
export const handler: Handler = async (
event: APIGatewayEvent,
context: Context
) => {
return slsApp(event, context);
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment