fix: Improve error handling for community package installation (#19103)

This commit is contained in:
Shireen Missi
2025-09-05 08:55:48 +01:00
committed by GitHub
parent 6d76733200
commit 2001397387
2 changed files with 82 additions and 0 deletions

View File

@@ -64,6 +64,39 @@ describe('verifyIntegrity', () => {
expect(error.cause.message).toContain('Network failure'); expect(error.cause.message).toContain('Network failure');
} }
}); });
it('should return generic message for DNS getaddrinfo errors', async () => {
const integrity = 'sha512-somerandomhash==';
nock(registryUrl)
.get(`/${encodeURIComponent(packageName)}/${version}`)
.replyWithError('getaddrinfo ENOTFOUND internal.registry.local');
try {
await verifyIntegrity(packageName, version, registryUrl, integrity);
throw new Error('Expected error was not thrown');
} catch (error: any) {
expect(error).toBeInstanceOf(UnexpectedError);
expect(error.message).toBe(
'Checksum verification failed. Please check your network connection and try again.',
);
expect(error.cause).toBeUndefined();
}
});
it('should return generic message for DNS ENOTFOUND errors', async () => {
const integrity = 'sha512-somerandomhash==';
nock(registryUrl)
.get(`/${encodeURIComponent(packageName)}/${version}`)
.replyWithError('ENOTFOUND some.internal.registry');
await expect(verifyIntegrity(packageName, version, registryUrl, integrity)).rejects.toThrow(
new UnexpectedError(
'Checksum verification failed. Please check your network connection and try again.',
),
);
});
}); });
describe('isVersionExists', () => { describe('isVersionExists', () => {
@@ -137,4 +170,38 @@ describe('isVersionExists', () => {
UnexpectedError, UnexpectedError,
); );
}); });
it('should return generic message for DNS getaddrinfo errors', async () => {
nock(registryUrl)
.get(`/${encodeURIComponent(packageName)}/${version}`)
.replyWithError('getaddrinfo ENOTFOUND internal.registry.local');
try {
await isVersionExists(packageName, version, registryUrl);
throw new Error('Expected error was not thrown');
} catch (error: any) {
expect(error).toBeInstanceOf(UnexpectedError);
expect(error.message).toBe(
'The community nodes service is temporarily unreachable. Please try again later.',
);
expect(error.cause).toBeUndefined();
}
});
it('should return generic message for DNS ENOTFOUND errors', async () => {
nock(registryUrl)
.get(`/${encodeURIComponent(packageName)}/${version}`)
.replyWithError('ENOTFOUND some.internal.registry');
try {
await isVersionExists(packageName, version, registryUrl);
throw new Error('Expected error was not thrown');
} catch (error: any) {
expect(error).toBeInstanceOf(UnexpectedError);
expect(error.message).toBe(
'The community nodes service is temporarily unreachable. Please try again later.',
);
expect(error.cause).toBeUndefined();
}
});
}); });

View File

@@ -1,6 +1,11 @@
import axios from 'axios'; import axios from 'axios';
import { UnexpectedError } from 'n8n-workflow'; import { UnexpectedError } from 'n8n-workflow';
function isDnsError(error: unknown): boolean {
const message = error instanceof Error ? error.message : String(error);
return message.includes('getaddrinfo') || message.includes('ENOTFOUND');
}
const REQUEST_TIMEOUT = 30000; const REQUEST_TIMEOUT = 30000;
export async function verifyIntegrity( export async function verifyIntegrity(
@@ -22,6 +27,11 @@ export async function verifyIntegrity(
throw new UnexpectedError('Checksum verification failed. Package integrity does not match.'); throw new UnexpectedError('Checksum verification failed. Package integrity does not match.');
} }
} catch (error) { } catch (error) {
if (isDnsError(error)) {
throw new UnexpectedError(
'Checksum verification failed. Please check your network connection and try again.',
);
}
throw new UnexpectedError('Checksum verification failed', { cause: error }); throw new UnexpectedError('Checksum verification failed', { cause: error });
} }
} }
@@ -43,6 +53,11 @@ export async function isVersionExists(
cause: error, cause: error,
}); });
} }
if (isDnsError(error)) {
throw new UnexpectedError(
'The community nodes service is temporarily unreachable. Please try again later.',
);
}
throw new UnexpectedError('Failed to check package version existence', { cause: error }); throw new UnexpectedError('Failed to check package version existence', { cause: error });
} }
} }