InversifyJS icon indicating copy to clipboard operation
InversifyJS copied to clipboard

onDeactivation throws 'TypeError: Cannot convert undefined or null to object'

Open saltylassi opened this issue 3 years ago • 2 comments

If container has both onActivation handler and onDeactivation, onDeactivation throws error.

Expected Behavior

working without error

Current Behavior

this error pops out

$ yarn build && node ./dist/main.js
$ tsc
blade instance Activation!
C:\Users\user\Desktop\projects\inversify-test\node_modules\inversify\lib\container\container.js:453
        var constructor = Object.getPrototypeOf(instance).constructor;
                                 ^

TypeError: Cannot convert undefined or null to object
    at Function.getPrototypeOf (<anonymous>)
    at Container._deactivate (C:\Users\user\Desktop\projects\inversify-test\node_modules\inversify\lib\container\container.js:453:34)
    at Container._deactivateIfSingleton (C:\Users\user\Desktop\projects\inversify-test\node_modules\inversify\lib\container\container.js:634:21)
    at Container._deactivateSingletons (C:\Users\user\Desktop\projects\inversify-test\node_modules\inversify\lib\container\container.js:639:31)
    at Container.unbind (C:\Users\user\Desktop\projects\inversify-test\node_modules\inversify\lib\container\container.js:261:18)
    at Object.<anonymous> (C:\Users\user\Desktop\projects\inversify-test\dist\main.js:155:11)
    at Module._compile (internal/modules/cjs/loader.js:1068:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1097:10)
    at Module.load (internal/modules/cjs/loader.js:933:32)
    at Function.Module._load (internal/modules/cjs/loader.js:774:14)

Possible Solution

Steps to Reproduce (for bugs)

  1. follow these docs :

https://github.com/inversify/InversifyJS/blob/master/wiki/container_api.md#containeronactivationtserviceidentifier-interfacesserviceidentifiert-onactivation-interfacesbindingactivationt-void

https://github.com/inversify/InversifyJS/blob/master/wiki/container_api.md#ondeactivationtserviceidentifier-interfacesserviceidentifiert-ondeactivation-interfacesbindingdeactivationt-void

https://github.com/inversify/InversifyJS/blob/master/wiki/deactivation_handler.md#deactivation-handler

  1. run this sample :

@injectable()
export interface IBlade {
  sharpness: number;
}

export class Blade implements IBlade {
  constructor(@optional() public sharpness: number = 5) {}
}
const container = new Container();
container.bind<IBlade>(IDENTIFIERS.Blade).to(Blade).inSingletonScope();
container.onActivation(IDENTIFIERS.Blade, () => {
  console.log('blade instance Activation!');
});
container.onDeactivation(IDENTIFIERS.Blade, (blade: IBlade): void | Promise<void> => {
  console.log('blade instance deactivation!');
});

container.get<IBlade>(IDENTIFIERS.Blade);
container.unbind(IDENTIFIERS.Blade);

  1. error occurs
TypeError: Cannot convert undefined or null to object
    at Function.getPrototypeOf (<anonymous>)
    at Container._deactivate (C:\Users\user\Desktop\projects\inversify-test\node_modules\inversify\lib\container\container.js:453:34)
    at Container._deactivateIfSingleton (C:\Users\user\Desktop\projects\inversify-test\node_modules\inversify\lib\container\container.js:634:21)
    at Container._deactivateSingletons (C:\Users\user\Desktop\projects\inversify-test\node_modules\inversify\lib\container\container.js:639:31)
    at Container.unbind (C:\Users\user\Desktop\projects\inversify-test\node_modules\inversify\lib\container\container.js:261:18)
    at Object.<anonymous> (C:\Users\user\Desktop\projects\inversify-test\dist\main.js:155:11)
    at Module._compile (internal/modules/cjs/loader.js:1068:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1097:10)
    at Module.load (internal/modules/cjs/loader.js:933:32)
    at Function.Module._load (internal/modules/cjs/loader.js:774:14)

Context

Your Environment

  • Version used:
   "@types/node": "^17.0.35",
   "inversify": "^6.0.1",
   "reflect-metadata": "^0.1.13",
   "typescript": "^4.6.4"
  • Environment name and version (e.g. Chrome 39, node.js 5.4):
   node 14.17.0
  • Operating System and version (desktop or mobile):
   Windows 10
  • Link to your project:

Stack trace

saltylassi avatar May 25 '22 01:05 saltylassi

I've got the same error message but with a different scenario. I accidentally bound "undefined" on the container:

import 'reflect-metadata';
import { Container } from 'inversify';
const container = new Container();
container.bind('Test').toConstantValue(undefined);
console.log(container.get('Test')); // undefined
container.unbindAll(); // Error: Cannot convert undefined or null to object

This issue can be resolved by removing improper binding.

oscar60310 avatar Aug 02 '22 07:08 oscar60310

We're facing same error on container.unbindAll() call after inversify upgrade:

"inversify": "6.0.2",
"typescript": "4.9.5"

inversify6 0 2-error

am0wa avatar Nov 08 '23 12:11 am0wa