onDeactivation throws 'TypeError: Cannot convert undefined or null to object'
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)
- 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
- 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);
- 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
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.
We're facing same error on container.unbindAll() call after inversify upgrade:
"inversify": "6.0.2",
"typescript": "4.9.5"