镜像站点 · 本页由第三方 GitHub 只读镜像提供,非 GitHub 官方站点,不接受任何登录或凭据输入。前往 github.com
Skip to content

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

Open

Description

@awongCM

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.

Activity

  1. marcelobern commented on Mar 5, 2023

    @marcelobern
    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.

  2. awongCM commented on Mar 6, 2023

    @awongCM
    Author

    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.

  3. awongCM commented on Mar 6, 2023

    @awongCM
    Author

    @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... 😕

  4. marcelobern commented on Mar 9, 2023

    @marcelobern
    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?

  5. awongCM commented on Mar 15, 2023

    @awongCM
    Author

    @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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions