Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Loopback 4 example - convert lamdba-wrapper.js to Typescript equivalent. #40

Open
awongCM opened this issue Mar 5, 2023 · 5 comments
Open

Comments

@awongCM
Copy link

awongCM commented Mar 5, 2023

Hi,
I've followed the loopback 4 example for this and I really like how you have the framework to play nicely with serverless framework when following the tutorial!

The thing I'm confused about is the lambda wrapper js file.

https://github.com/botbits/serverless-loopback/blob/master/examples/lb4-express/src/lambda-wrapper.js

Could it not have been better to rewrite it in Typescript in the following:

import {ExpressServer} from '../server';

import serverless from 'serverless-http';

import {ApplicationConfig} from '@loopback/core';

let app: Function;

async function main(options: ApplicationConfig) {
  const server = new ExpressServer(options);
  app = serverless(server.app);
  await server.boot();
  await server.start();
  console.log('Server is running at http://127.0.0.1:3000');
}

exports.handler = async function handler(
  request: Object,
  ...context: Object[]
) {
  if (app === undefined) {
    // Run the application
    const config = {
      rest: {
        port: +(process.env.PORT ? process.env.PORT : 3000),
        host: process.env.HOST ? process.env.HOST : 'localhost',
        openApiSpec: {
          // useful when used with OpenAPI-to-GraphQL to locate your application
          setServersFromRequest: true,
        },
        // Use the LB4 application as a route. It should not be listening.
        listenOnStart: false,
      },
    };
    await main(config).catch(err => {
      console.error('Cannot start the application.', err);
      process.exit(1);
    });
  }
  return app(request, ...context);
};

That way, you don't need to configure tsconfig.json to include raw JS files as part of the build process and you only have Typescript files to work with, not JS/Typescript files combo..

I'm just curious what's your rationale is keeping both JS and Typescript this way.

@marcelobern
Copy link
Contributor

Hi @awongCM, happy to hear you found the tutorial useful!

To the best of my recollection, the reason for JS rather than TS was that LB4 was added as a fix and I did not spend the time to look into the TS code as I was unfamiliar with TypeScript :-)

If you feel comfortable, please go ahead and create a PR for this change.

Or if you prefer, I can do the PR with the code provided.

@awongCM
Copy link
Author

awongCM commented Mar 6, 2023

Hi @awongCM, happy to hear you found the tutorial useful!

To the best of my recollection, the reason for JS rather than TS was that LB4 was added as a fix and I did not spend the time to look into the TS code as I was unfamiliar with TypeScript :-)

If you feel comfortable, please go ahead and create a PR for this change.

Or if you prefer, I can do the PR with the code provided.

Hi @marcelobern

Ah. That makes sense!

Thank you for the candid reply. I certainly enjoy the tutorial - without a doubt! I have been working on my own pet serverless projects on my profile, and I've been recommended by my colleague how great the loopback framework is for building enterprise-level microservices due to its strong DDD philosophy.

Thus it had me pondering how to incorporate loopback's microservices architecture into the serverless world until I googled "loopback serverless" which lead me to your GitHub repo as the first search result page.. ;)

I'm more than happy to contribute. 👍

Let me create one and get back to on the PR submitted.

@awongCM
Copy link
Author

awongCM commented Mar 6, 2023

@marcelobern

I create my local PR; did the above code to replace .js counterpart file.

But when I tried to run presls-deploy, I ran into the following:

node_modules/@loopback/testlab/node_modules/@types/express-serve-static-core/index.d.ts:1183:31 - error TS1005: ';' expected.

1183      * Render the given view `name` name with `options`
                                   ~~~~

node_modules/@loopback/testlab/node_modules/@types/express-serve-static-core/index.d.ts:1183:48 - error TS1005: ';' expected.

1183      * Render the given view `name` name with `options`
                                                    ~~~~~~~

node_modules/@loopback/testlab/node_modules/@types/express-serve-static-core/index.d.ts:1199:16 - error TS1005: ';' expected.

1199      * A node `http.Server` is returned, with this
                    ~~~~

node_modules/@loopback/testlab/node_modules/@types/express-serve-static-core/index.d.ts:1200:33 - error TS1005: ';' expected.

1200      * application (which is a `Function`) as its
                                     ~~~~~~~~

node_modules/@loopback/testlab/node_modules/@types/express-serve-static-core/index.d.ts:1268:1 - error TS1160: Unterminated template literal.

1268 
     

I'm getting lot of Typescript compilation errors... 😕

@marcelobern
Copy link
Contributor

@awongCM this brings some memories.

I vaguely recall getting into some TypeScript issues that I did not know how to solve and wanted to add the lb4 sample.

So I guess these might have been it :-D

I am not sure I can help you with the TypeScript errors, but I will ask you all the same. How can I help?

@awongCM
Copy link
Author

awongCM commented Mar 15, 2023

@awongCM this brings some memories.

I vaguely recall getting into some TypeScript issues that I did not know how to solve and wanted to add the lb4 sample.

So I guess these might have been it :-D

I am not sure I can help you with the TypeScript errors, but I will ask you all the same. How can I help?

Interesting.

Odd thing is that I never run into any problems when cloning the loopback4 examples as a separate project; followed the tutorial; convert the main lambda wrapper to Typescript.

It works fine there after.

Perhaps there's some config settings from either tsconfig.json or similar that's not liking here...

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants