Merge pull request #16133 from coti-z/fix/injector-unhandled-promise-rejection

fix(core): add missing catch handler for forward-ref provider resolution
This commit is contained in:
Kamil Mysliwiec
2025-12-29 09:30:11 +01:00
committed by GitHub
2 changed files with 36 additions and 3 deletions

View File

@@ -553,9 +553,13 @@ export class Injector {
* instantiated beforehand.
*/
instanceHost.donePromise &&
void instanceHost.donePromise.then(() =>
this.loadProvider(instanceWrapper, moduleRef, contextId, inquirer),
);
void instanceHost.donePromise
.then(() =>
this.loadProvider(instanceWrapper, moduleRef, contextId, inquirer),
)
.catch(err => {
instanceWrapper.settlementSignal?.error(err);
});
}
if (instanceWrapper.async) {
const host = instanceWrapper.getInstanceByContextId(

View File

@@ -11,6 +11,7 @@ import { NestContainer } from '../../injector/container';
import { Injector, PropertyDependency } from '../../injector/injector';
import { InstanceWrapper } from '../../injector/instance-wrapper';
import { Module } from '../../injector/module';
import { SettlementSignal } from '../../injector/settlement-signal';
chai.use(chaiAsPromised);
@@ -546,6 +547,34 @@ describe('Injector', () => {
expect(result.instance).to.be.true;
});
});
describe('when instanceWrapper has forward ref and is in non-static context', () => {
it('should call settlementSignal.error when loadProvider throws', async () => {
const error = new Error('Test error');
const settlementSignal = new SettlementSignal();
const errorSpy = sinon.spy(settlementSignal, 'error');
const wrapper = new InstanceWrapper({
isResolved: false,
forwardRef: true,
});
wrapper.settlementSignal = settlementSignal;
const contextId = { id: 2 };
const instanceHost = wrapper.getInstanceByContextId(contextId);
instanceHost.donePromise = Promise.resolve();
sinon
.stub(injector, 'loadProvider')
.callsFake(() => Promise.reject(error));
await injector.resolveComponentHost(module, wrapper, contextId);
await new Promise(resolve => setImmediate(resolve));
expect(errorSpy.calledOnce).to.be.true;
expect(errorSpy.calledWith(error)).to.be.true;
});
});
});
describe('applyProperties', () => {