mirror of
https://github.com/nestjs/nest.git
synced 2026-02-21 23:11:44 +00:00
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:
@@ -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(
|
||||
|
||||
@@ -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', () => {
|
||||
|
||||
Reference in New Issue
Block a user