Giter VIP home page Giter VIP logo

nestjs-dataloader's Introduction

NestJS Dataloader

Node.js CI Coverage Status

NestJS dataloader simplifies adding graphql/dataloader to your NestJS project. DataLoader aims to solve the common N+1 loading problem.

Installation

Install with yarn

yarn add nestjs-dataloader

Install with npm

npm install --save nestjs-dataloader

Usage

NestDataLoader Creation

We start by implementing the NestDataLoader interface. This tells DataLoader how to load our objects.

import * as DataLoader from 'dataloader';
import { Injectable } from '@nestjs/common';
import { NestDataLoader } from 'nestjs-dataloader';
...

@Injectable()
export class AccountLoader implements NestDataLoader<string, Account> {
  constructor(private readonly accountService: AccountService) { }

  generateDataLoader(): DataLoader<string, Account> {
    return new DataLoader<string, Account>(keys => this.accountService.findByIds(keys));
  }
}

The first generic of the interface is the type of ID the datastore uses. The second generic is the type of object that will be returned. In the above instance, we want DataLoader to return instances of the Account class.

Providing the NestDataLoader

For each NestDataLoader we create, we need to provide it to our module.

import { Module } from '@nestjs/common';
import { APP_INTERCEPTOR } from '@nestjs/core';
import {DataLoaderInterceptor} from 'nestjs-dataloader'
...

@Module({
  providers: [
    AccountResolver,
    AccountLoader,
    {
      provide: APP_INTERCEPTOR,
      useClass: DataLoaderInterceptor,
    },
  ],

})
export class ResolversModule { }

Using the NestDataLoader

Now that we have a dataloader and our module is aware of it, we need to pass it as a parameter to an endpoint in our graphQL resolver.

import * as DataLoader from 'dataloader';
import { Loader } from 'nestjs-dataloader';
...

@Resolver(Account)
export class AccountResolver {

    @Query(() => [Account])
    public getAccounts(
        @Args({ name: 'ids', type: () => [String] }) ids: string[],
        @Loader(AccountLoader) accountLoader: DataLoader<Account['id'], Account>): Promise<Account[]> {
        return accountLoader.loadMany(ids);
    }
}

The important thing to note is that the parameter of the @Loader decorator is the entity/class of the NestDataLoader we want to be injected to the method. The DataLoader library will handle bulk retrieval and caching of our requests. Note that the caching is stored on a per-request basis.

Contributing

Pull requests are always welcome. For major changes, please open an issue first to discuss what you would like to change.

nestjs-dataloader's People

Contributors

0b10 avatar 9renpoto avatar dependabot-preview[bot] avatar ecavalcanti avatar krislefeber avatar mayank avatar pablo-abc avatar ronniehicks avatar schardtbc avatar tarazou9 avatar waqasjamil avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar

nestjs-dataloader's Issues

Quick Question Job offer

I am the founder of a well funded VC-backed social stock app called Iris. We allow our users to connect their Robinhood or other broker to our platform so they can share their trades with their friends and family real-time.

We are looking to expand our backend team, we use nestjs, graphql etc. Are you open to hoping on a call for 30 min?

Strict type checking + custom cacheKeyFn gives a compile error

Hi,

For one of our dataloaders in our NestJS GraphQL API, we have a composite key. Initially we had configured the dataloader to use this composite key as a tuple, but I noticed that this resulted in an issue with caching. The cache map has duplicated keys. When it eventually performs the SQL query, there are a lot of AND statements tied together with OR statements (one AND statement per composite key).

While this, performance wise does not cause issues, I still wanted to look into it. I tried using the cacheKeyFn function to transform the tuple into a string, so that the composite key would be saved in the cache as a string, and it would recognize the duplication itself.

This works as expected, but NOT with strict parameter enabled in tsconfig. I have to ignore the file from compilation errors to allow it to run. Below is the code of the creation of our DataLoader. The DataLoader still expects the composite key, as this is also what our repository layer expects. However, as you can see we use the cacheKeyFn to store the key as a string in the cache.

private createCodeLoader() {
      return new DataLoader<[string, string], GeneralCodeDb | null>(
          async (keys: readonly [string, string][]) => {
              return this.codeService.findByCategoriesAndKeys([...keys]);
          },
          {
              cacheKeyFn: (key) => {
                  return key.toString();
              },
          }
      );
  }

When I log the codeDataLoader object, you can see the cache is correctly set.

DataLoader {
  _batchLoadFn: [AsyncFunction (anonymous)],
  _maxBatchSize: Infinity,
  _batchScheduleFn: [Function (anonymous)],
  _cacheKeyFn: [Function: cacheKeyFn],
  _cacheMap: Map(1) { 'CLS_LG,1' => Promise { [GeneralCodeDb] } },
  _batch: {
    hasDispatched: false,
    keys: [],
    callbacks: [],
    cacheHits: [
      [Function (anonymous)],
      [Function (anonymous)],
      [Function (anonymous)],
      [Function (anonymous)],
      [Function (anonymous)],
      [Function (anonymous)],
      [Function (anonymous)],
      [Function (anonymous)]
    ]
  },
  name: null
}

However, enabling the strict parameter, this error is logged:

src/modules/dataloader/dataloader.service.ts:91:17 - error TS2322: Type '(key: [string, string]) => string' is not assignable to type '(key: [string, string]) => [string, string]'.
  Type 'string' is not assignable to type '[string, string]'.

91                 cacheKeyFn: (key) => {

Am I implementing it incorrectly, or is something off in the typechecking?

extra params for dataloader function

Hello,
is it possible to append in the loadMany and load method a "optional" parameter? I need this for add a language code to the dataloader function, because there I need it.

Or what i the best way to do this?

Thanks

volbrene

Property 'generateDataLoader' in type ... is not assignable to the same property in base type

The project I'm trying to use nestjs-dataloader in uses import DataLoader from "dataloader"; syntax for imports, via the esModuleInterop: true flag in tsconfig.json

This seems to conflict with the way DataLoader is imported here:
https://github.com/krislefeber/nestjs-dataloader/blob/master/index.ts#L11

And it results in errors such as:

error TS2416: Property 'generateDataLoader' in type 'CanEditMatchdayLoader' is not assignable to the same property in base type 'NestDataLoader<string, Matchday>'.
  Type '() => import("/home/aandrei/projects/projectsport-server/node_modules/dataloader/index")<string, import("/home/aandrei/projects/projectsport-server/src/matchday/matchday.model").Matchday, string>' is not assignable to type '() => DataLoader<string, import("/home/aandrei/projects/projectsport-server/src/matchday/matchday.model").Matchday, string>'.
    Call signature return types 'DataLoader<string, Matchday, string>' and 'DataLoader<string, Matchday, string>' are incompatible.
      The types returned by 'clear(...)' are incompatible between these types.
        Type 'DataLoader<string, Matchday, string>' is not assignable to type 'this'.

11   generateDataLoader(): DataLoader<string, Matchday> {

I have confirmed that changing the tsconfig of nestjs-dataloader to enable esModuleInterop and using the same of type of import results in the error being fixed.

I'm not sure what the proper fix is here, but I think as a best practice, the typescript file should not be published to npm, but instead only publish the d.ts and compiled .js. It's likely that the index.ts file is interfering somehow.

Error with NestJS 7

I have tried upgrading to NestJS 7.0.7 and nestjs-dataloader to 7.0.0 and I'm getting the following error when trying to start the server:

The types returned by 'clear(...)' are incompatible between these types.
        Type 'DataLoader<number, Topic, number>' is not assignable to type 'this'.

11   generateDataLoader(): DataLoader<number, Topic> {

This is how my code looks like:

import DataLoader from 'dataloader';
import { Injectable } from '@nestjs/common';
import { NestDataLoader } from 'nestjs-dataloader';
import { TopicsService } from './topics.service';
import { Topic } from './topics.entity';

@Injectable()
export class TopicsLoader implements NestDataLoader<number, Topic> {
  constructor(private readonly topicsService: TopicsService) { }

  generateDataLoader(): DataLoader<number, Topic> {
    return new DataLoader<number, Topic>(keys => this.topicsService.findByIds([...keys]));
  }
}

Accessing graphql context from loader

In loaders it is usually necessary to access the graphql execution context.

As per NestJS documentation I attempted to do it like this:

import { CONTEXT } from "@nestjs/graphql";

@Injectable({ scope: Scope.REQUEST })
export class CanEditMatchdayLoader implements NestDataLoader<string, boolean> {
  constructor(
    private readonly matchdayService: MatchdayService,
    @Inject(CONTEXT) private context: any,
  ) {
    console.log(context); // prints undefined
  }

  generateDataLoader(): DataLoader<string, boolean> {
     ...
  }
}

But context appears to be undefined no matter what I do. I assume this is caused by nestjs-dataloader somehow, because the nestjs documentation specifically mentions this use case.

Alternatively, this would also seem to be fixed by #11

ID order in example

In the example id: In(ids as string[]) is used to query the database, however I don't believe this guarantees the order of the IDs? Although I could be wrong.

EDIT:
i.e:

const accounts = this.accounts.find({
      id: In(ids as string[]),
    })

return ids.map((id) => accounts.find((n) => n.id === id))

Instead?

Compatibility issue with nest v7.1.2

After upgrading nestjs version 7.1.2, dataloader is not working with this message.
MyLoader is marked as a scoped provider. Request and transient-scoped providers can't be used in combination with \"get()\" method. Please, use \"resolve()\" instead.

Relevant issue in nestjs is this.

Property generateDataLoader in type 'Loader' is not assignable to the same property in base type 'NestDataLoader<number,'Entity'>.

Hi, I'm going through a problem with the methods generateDataLoader() in NestDataLoader

This is the code

import * as DataLoader from 'dataloader';
import { Injectable } from '@nestjs/common';
import { NestDataLoader } from 'nestjs-dataloader';
import { Entity } from '../../shared/entities/';
import { In } from 'typeorm';

@Injectable()
export class Loader implements NestDataLoader <number, Entity> {

generateDataLoader(): DataLoader<number, Entity> {
return new DataLoader<number, Entity>(keys => this.findByKeys(keys));
}

private async findByKeys( keys: number[]) {
const accounts = await Entity.find( {entityKey: In(keys)} );
const result = keys.map(key => accounts.filter((account) => account.entityKey === key));
return result;
}
}

The error is as follows if i over the method generateDataLoader()
and in the parameter keys on method (findByKeys)

(method) Loader.generateDataLoader(): DataLoader<number, Entity, number>
Should return a new instance of dataloader each time

Property 'generateDataLoader' in type 'Loader' is not assignable to the same property in base type 'NestDataLoader<number, Entity>'.
Type '() => DataLoader<number, Entity, number>' is not assignable to type '() => DataLoader<number, Entity>'.
Type 'DataLoader<number, Entity, number>' is not assignable to type 'DataLoader<number, Entity>'.
Types of property 'loadMany' are incompatible.
Type '(keys: ArrayLike) => Promise<(Entity | Error)[]>' is not assignable to type '(keys: number[]) => Promise'.
Type 'Promise<(Entity | Error)[]>' is not assignable to type 'Promise'.
Type '(Entity | Error)[]' is not assignable to type 'Entity'.
Type 'Entity | Error' is not assignable to type 'Entity'.
Type 'Error' is missing the following properties from type 'Entity': length, pop, push, concat, and 28 more.ts(2416)

Also after run npm install i get this error , I m on Windows

npm WARN optional SKIPPING OPTIONAL DEPENDENCY: [email protected] (node_modules\nestjs-dataloader\node_modules\fsevents): It has something to do?

can somebody help me with this please ?

Dataloader executing in HttpRequest with empty context in NestJSv7

I migrated to new Nestjsv7
I'm using REST controller for auth and GraphQL for the other modules.
When I execute a request with REST API, it executes the DataloaderInterceptor and throws with this error:

2020-04-29T04:25:47.261Z]  INFO: HANGMAN-API/23932 on x: GraphQL Playground listening on port http://localhost:8087/graphql []
(node:23932) Warning: The route option `beforeHandler` has been deprecated, use `preHandler` instead
[2020-04-29T04:25:49.245Z] ERROR: HANGMAN-API/23932 on x: 
    Cannot read property 'NEST_LOADER_CONTEXT_KEY' of undefined TypeError: Cannot read property 'NEST_LOADER_CONTEXT_KEY' of undefined
        at DataLoaderInterceptor.intercept (/home/dantehemerson/Documents/repos/hangman-api/node_modules/nestjs-dataloader/dist/index.js:32:16)
        at /home/dantehemerson/Documents/repos/hangman-api/node_modules/@nestjs/core/interceptors/interceptors-consumer.js:22:36
        at InterceptorsConsumer.intercept (/home/dantehemerson/Documents/repos/hangman-api/node_modules/@nestjs/core/interceptors/interceptors-consumer.js:24:24)
        at /home/dantehemerson/Documents/repos/hangman-api/node_modules/@nestjs/core/router/router-execution-context.js:45:60
        at Object.<anonymous> (/home/dantehemerson/Documents/repos/hangman-api/node_modules/@nestjs/core/router/router-proxy.js:8:23)
        at preHandlerCallback (/home/dantehemerson/Documents/repos/hangman-api/node_modules/fastify/lib/handleRequest.js:111:30)
        at preValidationCallback (/home/dantehemerson/Documents/repos/hangman-api/node_modules/fastify/lib/handleRequest.js:100:5)
        at handler (/home/dantehemerson/Documents/repos/hangman-api/node_modules/fastify/lib/handleRequest.js:69:5)
        at handleRequest (/home/dantehemerson/Documents/repos/hangman-api/node_modules/fastify/lib/handleRequest.js:30:9)
        at onRunMiddlewares (/home/dantehemerson/Documents/repos/hangman-api/node_modules/fastify/lib/middleware.js:22:5)
        at Holder.done (/home/dantehemerson/Documents/repos/hangman-api/node_modules/middie/middie.js:90:9)
        at SessionStrategy.strategy.pass (/home/dantehemerson/Documents/repos/hangman-api/node_modules/passport/lib/middleware/authenticate.js:343:9)
        at SessionStrategy.authenticate (/home/dantehemerson/Documents/repos/hangman-api/node_modules/passport/lib/strategies/session.js:75:10)
        at attempt (/home/dantehemerson/Documents/repos/hangman-api/node_modules/passport/lib/middleware/authenticate.js:366:16)
        at authenticate (/home/dantehemerson/Documents/repos/hangman-api/node_modules/passport/lib/middleware/authenticate.js:367:7)
        at Holder.done (/home/dantehemerson/Documents/repos/hangman-api/node_modules/middie/middie.js:112:11)
        at initialize (/home/dantehemerson/Documents/repos/hangman-api/node_modules/passport/lib/middleware/initialize.js:53:5)
        at Holder.done (/home/dantehemerson/Documents/repos/hangman-api/node_modules/middie/middie.js:112:11)
        at internalNext (/home/dantehemerson/Documents/repos/hangman-api/node_modules/helmet/index.js:47:33)
        at xXssProtection (/home/dantehemerson/Documents/repos/hangman-api/node_modules/x-xss-protection/dist/index.js:47:13)
        at internalNext (/home/dantehemerson/Documents/repos/hangman-api/node_modules/helmet/index.js:51:7)
        at nosniff (/home/dantehemerson/Documents/repos/hangman-api/node_modules/dont-sniff-mimetype/dist/index.js:5:9)
[2020-04-29T04:25:49.246Z] ERROR: HANGMAN-API/23932 on x: Cannot read property 'NEST_LOADER_CONTEXT_KEY' of undefined

That is because here the context is undefined:

if (ctx[NEST_LOADER_CONTEXT_KEY] === undefined) {
ctx[NEST_LOADER_CONTEXT_KEY] = async (type: string) : Promise<NestDataLoader<any, any>> => {
if (ctx[type] === undefined) {

If I add extra validation like this

if (ctx && ctx[NEST_LOADER_CONTEXT_KEY] === undefined) {

this works. Could You help me with this error please.

Here is my repository for reproduction:
https://github.com/dantehemerson/hangman-api

The loader UserLoader is not provided

I provided UserLoader into module providers still i get above issue
also i debug code and what i found is in code is that
this below line
this.moduleRef.get<NestDataLoader<any, any>>(type, { strict: false })
returns empty class like this (UserLoader {}) without generateDataLoader function thats why it throws
Please give me a solution for this.

@Loader decorator broken with new NestJS release (v7)

The method signature for "createParamDecorator" changed in the new release of NestJS. I believe it should now be:

export const Loader = createParamDecorator((data: string, ctx: ExecutionContext) => { const context = GqlExecutionContext.create(ctx).getContext() //rest of functionality using this context });

Unnecessary function wrap

In your examples, I believe this:

return new DataLoader<string, Account>(keys =>
      this.accountService.findByIds(keys)
)

Can be this:

return new DataLoader<string, Account>(this.accountService.findByIds)

If it's helpful.

Missing types in 9.0.0

Thanks for merging + publishing support for nestjs v9.

Unfortunately, there is an issue that prevents it from working out of the box: the typings files are not properly referenced.

In v2.0.11 (the previous version of the library), the types field in package.json referenced ./dist/index.d.ts.

However, in v9.0.0 (the current version), the types field references index.d.ts (note the lack of dist). Meanwhile, the index.d.ts file is still in dist.

I suspect reverting the change to the types field to reference ./dist/index.d.ts will fix it. Strangely, though, I don't see anywhere in the repo's history where the files field was changed โ€“ the repo version of 2.0.11 differs from the published version of 2.0.11.

Example of usage with ResolveProperty decodator

Hello there, I am new to GraphQL and have found a good way to use it along with NestJS library. I've used it a little and stuck with this N+1 problem, when after a couple of child nodes one query may cause a hundred calls to DB or whatever. I asked at forums and so on to find a solution and was advised to try your library. I am not sure that my question is really worth opening an issue here, but it is the only easy way I have to communicate with you, so... long story short here is my question

In your README example you showed usage of Loader decorator on a function with a Query decorator, so I can query multiple Accounts with a single call. But in my case I have something like that:
I have Account, each Account have many Subscribers (via ResolveProperty decorated function), each Subscriber have many NetworkResources and some other data (each one via ResolveProperty decorated function)

When I make a full query of one Account NestJS will make:
1 request to get Account itself
1 request to get all Subscribers by this Account id
1 request per each Subscriber it got from previous step to get NetworkResources by this Subscriber id
1 request per each other Subscriber ResolveProperty function

Assume each Account has 5 Subscribers, query to get one Accoount will cause 1 + 1 + 5 + ... requests. If I request for example 3 Accounts query will cause 1 + 3 + 3 * 5 + ... requests. All this water-falling is caused by the fact that ResolveProperty decorator works separately for each Subscriber instance even when I request several Subscribers.

Does your library allow to somehow have ResolveProperty decorator to get all NetworkResources of all 15 Subscribers from my example with one request and after it group them by its Subscriber? If yes, can you provide some example? If not can you advise some other solution that may fit my problem?

Problem with @Subscription(): stale data is returned for the lifetime of the subscription

It appears that when GQL Subscriptions are used, the data returned by dataloaders will remain stale for the duration of the subscription.

I believe this happens because the context is the same for the lifetime of the subscription, so once data gets initially cached, it keeps returning the same initial result for DataLoader-resolved fields.

Manually clearing the cache by injecting the Loader and calling loader.clearAll() prior to returning from the @Subscription() method seems to work. This can be tricky to do depending on how many loaders are used and where they are defined, and is prone to bugs by forgetting to clear something.

Remove "graphql" as a peer dependency

The graphql package isn't directly accessed by this library, and the dependency on @nestjs/graphql should be enough to suggest the graphql peer dependency required.

Currently, it lists 14.0.0 as a peer dependency, but this library works just fine with 15.0.0 (and probably 16.0.0)

Help with maintaining

๐Ÿ‘‹

If you want help with maintenance, let me know. I can take that on, if you'd like.

Error with Nest v7

Getting undefined is not a function
Here is stack trace. Any updates on this?

TypeError: undefined is not a function",
            "    at exports.Loader.common_1.createParamDecorator (/usr/src/app/node_modules/nestjs-dataloader/dist/index.js:55:48)",
            "    at shared_utils_1.isFunction.args (/usr/src/app/node_modules/@nestjs/core/helpers/context-utils.js:32:28)",
            "    at resolveParamValue (/usr/src/app/node_modules/@nestjs/core/helpers/external-context-creator.js:141:31)",
            "    at Array.map (<anonymous>)",
            "    at pipesFn 

Upgrade to dataloader v2

The interface differs slightly, for instance loadMany() has a return type of Array<V | Error>, but only Array<V> in v1.4.

Building my lambda using serverless-webpack throwing error 'Module '"../../../node_modules/nestjs-dataloader/dist"' has no exported member 'NestDataLoader'.'

I am trying to build my serverless app using NestJS Dataloader. Attached is my webpack config file.
The issue I am facing is that my webpack is looking for NestDataLoader in the dist/index.js file which doesnt have NestDataLoader defined in it. its actually the part of index.ts in NestJS Dataloader distribution.

const path = require('path')
const slsw = require('serverless-webpack')
const isLocal = slsw.lib.webpack.isLocal
const nodeExternals = require('webpack-node-externals')
const TsconfigPathsPlugin = require('tsconfig-paths-webpack-plugin');


module.exports = {
    mode: isLocal ? 'development' : 'production',
    devtool: isLocal ? 'source-map' : 'none',
    entry: slsw.lib.entries,
    target: 'node',
    resolve: {
        plugins: [new TsconfigPathsPlugin({ configFile: "./tsconfig.json" })],
        extensions: ['.mjs', '.ts', '.js']
    },
    output: {
        libraryTarget: 'commonjs2',
        path: path.join(__dirname, '.webpack'),
        filename: '[name].js'
    },
    externals: [nodeExternals()],
    module: {
        rules: [
            {
                test: /\.ts$/,
                exclude: /node_modules/,
                loader: 'ts-loader',
                options: { allowTsInNodeModules: true }
            }
        ]
    }
}

Usage in @FieldResolver()

Hi,

Is it possible to use nestjs-dataloader with something like below?

@Resolver(() => AccountDto)
export class AccountFieldResolver {
  constructor(private queryBus: QueryBus) {}

  @ResolveField(() => [AccountDto], { name: 'account' })
  async resolveCompanyAbsences(
    @Args('input') { id }: AccountKey,
    @Loader(CompanyEmployeeAbsenceLoader) accountLoader: DataLoader<AccountKey, Account>,
  ) {
     return accountLoader.load({ id });
  }

Seems that the interceptor is not being initialized and it fails with error
You should provide interceptor ${DataLoaderInterceptor.name} globally with ${APP_INTERCEPTOR}

Property 'intercept' in type 'DataLoaderInterceptor' is not assignable to the same property in base type 'NestInterceptor<any, any>'.

Seems like the nestjs-dataloader is outdated, it's not compatible with nest latest version. After updated to nest latest version I am getting an error.

below are the version details
Node version => v14.16.0
NPM version => 6.14.11

@nestjs/common = > 7.6.17
@nestjs/core => 7.6.17
@nestjs/graphql => 7.10.6
@nestjs/microservices => 7.6.17
@nestjs/platform-express => 7.6.17
nestjs-dataloader => 7.0.1

error details

Property 'intercept' in type 'DataLoaderInterceptor' is not assignable to the same property in base type 'NestInterceptor<any, any>'.
Type '(context: ExecutionContext, next: CallHandler<any>) => Observable<any>' is not assignable to type '(context: ExecutionContext, next: CallHandler<any>) => Observable<any> | Promise<Observable<any>>'.
Type 'Observable<any>' is not assignable to type 'Observable<any> | Promise<Observable<any>>'.
Property '_deprecatedSyncErrorSubscribe' is missing in type 'import("/Users/mac/Desktop/Projects/NodeJs/rubix/retail/middleware/videocall.service/node_modules/nestjs-dataloader/node_modules/rxjs/internal/Observable").Observable<any>' but required in type 'import("/Users/mac/Desktop/Projects/NodeJs/rubix/retail/middleware/videocall.service/node_modules/rxjs/dist/types/internal/Observable").Observable<any>'.

intercept(context: ExecutionContext, next: CallHandler): Observable<any> {
private _deprecatedSyncErrorSubscribe;
'_deprecatedSyncErrorSubscribe' is declared here.

Type 'Observable<any>' is missing the following properties from type 'Observable<any>': _isScalar, _trySubscribe, _subscribe
return next.handle();

Support Nestjs 8

Hello ๐Ÿ‘‹

Thank you for this library!

Can we add support for Nestjs 8.

See #50 for more ๐Ÿ‘

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.