ErrorHandling: Fixes issues with bad error messages (#63775)

This commit is contained in:
Torkel Ödegaard 2023-03-02 13:09:58 +01:00 committed by GitHub
parent a2bd98488d
commit 27070c252d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 34 additions and 4 deletions

View File

@ -118,6 +118,7 @@ export interface FetchError<T = any> {
status: number; status: number;
statusText?: string; statusText?: string;
data: T; data: T;
message?: string;
cancelled?: boolean; cancelled?: boolean;
isHandled?: boolean; isHandled?: boolean;
config: BackendSrvRequest; config: BackendSrvRequest;

View File

@ -24,6 +24,7 @@ import (
"github.com/grafana/grafana/pkg/services/secrets" "github.com/grafana/grafana/pkg/services/secrets"
"github.com/grafana/grafana/pkg/services/user" "github.com/grafana/grafana/pkg/services/user"
"github.com/grafana/grafana/pkg/setting" "github.com/grafana/grafana/pkg/setting"
"github.com/grafana/grafana/pkg/util"
"github.com/grafana/grafana/pkg/web" "github.com/grafana/grafana/pkg/web"
) )
@ -190,7 +191,7 @@ func (hs *HTTPServer) tryAutoLogin(c *contextmodel.ReqContext) bool {
func (hs *HTTPServer) LoginAPIPing(c *contextmodel.ReqContext) response.Response { func (hs *HTTPServer) LoginAPIPing(c *contextmodel.ReqContext) response.Response {
if c.IsSignedIn || c.IsAnonymous { if c.IsSignedIn || c.IsAnonymous {
return response.JSON(http.StatusOK, "Logged in") return response.JSON(http.StatusOK, util.DynMap{"message": "Logged in"})
} }
return response.Error(401, "Unauthorized", nil) return response.Error(401, "Unauthorized", nil)

View File

@ -317,6 +317,11 @@ export class BackendSrv implements BackendService {
let description = ''; let description = '';
let message = err.data.message; let message = err.data.message;
// Sometimes we have a better error message on err.message
if (message === 'Unexpected error' && err.message) {
message = err.message;
}
if (message.length > 80) { if (message.length > 80) {
description = message; description = message;
message = 'Error'; message = 'Error';

View File

@ -275,6 +275,26 @@ describe('backendSrv', () => {
'bogus-trace-id', 'bogus-trace-id',
]); ]);
}); });
it('It should favor error.message for fetch errors when error.data.message is Unexpected error', async () => {
const { backendSrv, appEventsMock } = getTestContext({});
backendSrv.showErrorAlert(
{
url: 'api/do/something',
} as BackendSrvRequest,
{
data: {
message: 'Unexpected error',
},
message: 'Failed to fetch',
status: 500,
config: {
url: '',
},
} as FetchError
);
expect(appEventsMock.emit).toHaveBeenCalledWith(AppEvents.alertError, ['Failed to fetch', '']);
});
}); });
}); });

View File

@ -1,10 +1,12 @@
import { isFetchError } from '@grafana/runtime'; import { isFetchError } from '@grafana/runtime';
export function getMessageFromError(err: unknown): string { export function getMessageFromError(err: unknown): string {
if (typeof err === 'string') {
return err;
}
if (err) { if (err) {
if (typeof err === 'string') { if (err instanceof Error) {
return err;
} else if (err instanceof Error) {
return err.message; return err.message;
} else if (isFetchError(err)) { } else if (isFetchError(err)) {
if (err.data && err.data.message) { if (err.data && err.data.message) {
@ -14,5 +16,6 @@ export function getMessageFromError(err: unknown): string {
} }
} }
} }
return JSON.stringify(err); return JSON.stringify(err);
} }