AgileConfig icon indicating copy to clipboard operation
AgileConfig copied to clipboard

Rest API Null Reference Exception on Node Server

Open tanisman opened this issue 9 months ago • 3 comments

Hi,

I set up the Agile Config using following docker compose:

version: '3.1'

services:
  db:
    image: mariadb
    restart: always
    environment:
      - MARIADB_ROOT_PASSWORD=${DB_PASS}
    volumes:
      - /opt/data:/var/lib/mysql:Z
      - ./setup.sql:/docker-entrypoint-initdb.d/setup.sql
  adminer:
    image: adminer
    restart: always
    ports:
      - 8080:8080
    depends_on:
      - db
  agile_config_admin:
    image: "kklldog/agile_config:latest"
    restart: always
    ports:
      - 80:5000
    volumes:
      - /etc/localtime:/etc/localtime
    environment:
      - TZ=Europe/Istanbul
      - adminConsole=true
      - db:provider=mysql
      - db:conn= database=${DB_NAME};data source=db;User Id=root;password=${DB_PASS}
    depends_on:
      - db
  agile_config_node1:
    image: "kklldog/agile_config:latest"
    restart: always
    ports:
       - "15001:5000"
    volumes:
      - /etc/localtime:/etc/localtime
    environment:
      - TZ=Europe/Istanbul
      - cluster=true
      - db:provider=mysql
      - db:conn= database=${DB_NAME};data source=db;User Id=root;password=${DB_PASS}
    depends_on:
      - agile_config_admin

I create one App (id: 123) and added a config to that App (key: key1)

when I use GET rest api on the Node Server with the console, everything works as expected:

GET http://localhost/api/Config?appId=123

[
	{
		"id": "0f599ebf3ffb4cfb8157af44aec10b6c",
		"appId": "123",
		"group": "group1",
		"key": "key1",
		"value": "value",
		"status": 1,
		"onlineStatus": 1,
		"editStatus": 10,
		"description": null
	}
]

but when I do same request on the other Node Server:

GET http://localhost:15001/api/Config?appId=123

I get 500 Internal Server Error, below is AgileConfig's produces error output:

2025-03-05T18:30:18.393185658Z fail: AgileConfig.Server.Common.ExceptionHandlerMiddleware[0]
2025-03-05T18:30:18.393216270Z       When ::ffff:172.26.0.1 request /api/Config error , but not handled .
2025-03-05T18:30:18.393218388Z        Object reference not set to an instance of an object.
2025-03-05T18:30:18.393219577Z           at AgileConfig.Server.Apisite.Models.Binders.EnvQueryStringBinder.BindModelAsync(ModelBindingContext bindingContext) in /src/AgileConfig.Server.Apisite/Models/Binders/EnvQueryStringBinder.cs:line 17
2025-03-05T18:30:18.393220768Z          at Microsoft.AspNetCore.Mvc.ModelBinding.Binders.BinderTypeModelBinder.BindModelAsync(ModelBindingContext bindingContext)
2025-03-05T18:30:18.393222075Z          at Microsoft.AspNetCore.Mvc.ModelBinding.ParameterBinder.BindModelAsync(ActionContext actionContext, IModelBinder modelBinder, IValueProvider valueProvider, ParameterDescriptor parameter, ModelMetadata metadata, Object value, Object container)
2025-03-05T18:30:18.393223251Z          at Microsoft.AspNetCore.Mvc.Controllers.ControllerBinderDelegateProvider.<>c__DisplayClass0_0.<<CreateBinderDelegate>g__Bind|0>d.MoveNext()
2025-03-05T18:30:18.393224723Z       --- End of stack trace from previous location ---
2025-03-05T18:30:18.393225724Z          at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.<InvokeInnerFilterAsync>g__Awaited|13_0(ControllerActionInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
2025-03-05T18:30:18.393226943Z          at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeNextResourceFilter>g__Awaited|25_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
2025-03-05T18:30:18.393228079Z          at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Rethrow(ResourceExecutedContextSealed context)
2025-03-05T18:30:18.393229119Z          at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
2025-03-05T18:30:18.393230278Z          at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.InvokeFilterPipelineAsync()
2025-03-05T18:30:18.393237055Z       --- End of stack trace from previous location ---
2025-03-05T18:30:18.393238092Z          at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeAsync>g__Awaited|17_0(ResourceInvoker invoker, Task task, IDisposable scope)
2025-03-05T18:30:18.393239923Z          at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeAsync>g__Awaited|17_0(ResourceInvoker invoker, Task task, IDisposable scope)
2025-03-05T18:30:18.393241004Z          at Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext context)
2025-03-05T18:30:18.393241973Z          at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context)
2025-03-05T18:30:18.393242987Z          at AgileConfig.Server.Apisite.Websocket.WebsocketHandlerMiddleware.Invoke(HttpContext context, IAppBasicAuthService appBasicAuth, IConfigService configService, IRegisterCenterService registerCenterService, IServiceInfoService serviceInfoService) in /src/AgileConfig.Server.Apisite/Websocket/WebsocketHandlerMiddleware.cs:line 123
2025-03-05T18:30:18.393244212Z          at AgileConfig.Server.Apisite.UIExtension.ReactUiMiddleware.Invoke(HttpContext context) in /src/AgileConfig.Server.Apisite/UIExtension/ReactUIMiddleware.cs:line 118
2025-03-05T18:30:18.393245265Z          at AgileConfig.Server.Common.ExceptionHandlerMiddleware.Invoke(HttpContext context) in /src/AgileConfig.Server.Common/ExceptionHandlerMiddleware.cs:line 27
2025-03-05T18:30:18.393246318Z       System.NullReferenceException: Object reference not set to an instance of an object.
2025-03-05T18:30:18.393247304Z          at AgileConfig.Server.Apisite.Models.Binders.EnvQueryStringBinder.BindModelAsync(ModelBindingContext bindingContext) in /src/AgileConfig.Server.Apisite/Models/Binders/EnvQueryStringBinder.cs:line 17
2025-03-05T18:30:18.393248384Z          at Microsoft.AspNetCore.Mvc.ModelBinding.Binders.BinderTypeModelBinder.BindModelAsync(ModelBindingContext bindingContext)
2025-03-05T18:30:18.393249391Z          at Microsoft.AspNetCore.Mvc.ModelBinding.ParameterBinder.BindModelAsync(ActionContext actionContext, IModelBinder modelBinder, IValueProvider valueProvider, ParameterDescriptor parameter, ModelMetadata metadata, Object value, Object container)
2025-03-05T18:30:18.393250528Z          at Microsoft.AspNetCore.Mvc.Controllers.ControllerBinderDelegateProvider.<>c__DisplayClass0_0.<<CreateBinderDelegate>g__Bind|0>d.MoveNext()
2025-03-05T18:30:18.393251639Z       --- End of stack trace from previous location ---
2025-03-05T18:30:18.393252771Z          at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.<InvokeInnerFilterAsync>g__Awaited|13_0(ControllerActionInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
2025-03-05T18:30:18.393253932Z          at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeNextResourceFilter>g__Awaited|25_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
2025-03-05T18:30:18.393255075Z          at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Rethrow(ResourceExecutedContextSealed context)
2025-03-05T18:30:18.393256073Z          at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
2025-03-05T18:30:18.393258622Z          at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.InvokeFilterPipelineAsync()
2025-03-05T18:30:18.393259601Z       --- End of stack trace from previous location ---
2025-03-05T18:30:18.393260560Z          at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeAsync>g__Awaited|17_0(ResourceInvoker invoker, Task task, IDisposable scope)
2025-03-05T18:30:18.393261642Z          at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeAsync>g__Awaited|17_0(ResourceInvoker invoker, Task task, IDisposable scope)
2025-03-05T18:30:18.393262710Z          at Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext context)
2025-03-05T18:30:18.393263688Z          at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context)
2025-03-05T18:30:18.393264690Z          at AgileConfig.Server.Apisite.Websocket.WebsocketHandlerMiddleware.Invoke(HttpContext context, IAppBasicAuthService appBasicAuth, IConfigService configService, IRegisterCenterService registerCenterService, IServiceInfoService serviceInfoService) in /src/AgileConfig.Server.Apisite/Websocket/WebsocketHandlerMiddleware.cs:line 123
2025-03-05T18:30:18.393265929Z          at AgileConfig.Server.Apisite.UIExtension.ReactUiMiddleware.Invoke(HttpContext context) in /src/AgileConfig.Server.Apisite/UIExtension/ReactUIMiddleware.cs:line 118
2025-03-05T18:30:18.393267184Z          at AgileConfig.Server.Common.ExceptionHandlerMiddleware.Invoke(HttpContext context) in /src/AgileConfig.Server.Common/ExceptionHandlerMiddleware.cs:line 27
2025-03-05T18:30:18.393459928Z fail: Microsoft.AspNetCore.Server.Kestrel[13]
2025-03-05T18:30:18.393470793Z       Connection id "0HNAS291A3M9C", Request id "0HNAS291A3M9C:00000001": An unhandled exception was thrown by the application.
2025-03-05T18:30:18.393472388Z       System.NullReferenceException: Object reference not set to an instance of an object.
2025-03-05T18:30:18.393473575Z          at AgileConfig.Server.Apisite.Models.Binders.EnvQueryStringBinder.BindModelAsync(ModelBindingContext bindingContext) in /src/AgileConfig.Server.Apisite/Models/Binders/EnvQueryStringBinder.cs:line 17
2025-03-05T18:30:18.393476569Z          at Microsoft.AspNetCore.Mvc.ModelBinding.Binders.BinderTypeModelBinder.BindModelAsync(ModelBindingContext bindingContext)
2025-03-05T18:30:18.393477628Z          at Microsoft.AspNetCore.Mvc.ModelBinding.ParameterBinder.BindModelAsync(ActionContext actionContext, IModelBinder modelBinder, IValueProvider valueProvider, ParameterDescriptor parameter, ModelMetadata metadata, Object value, Object container)
2025-03-05T18:30:18.393478776Z          at Microsoft.AspNetCore.Mvc.Controllers.ControllerBinderDelegateProvider.<>c__DisplayClass0_0.<<CreateBinderDelegate>g__Bind|0>d.MoveNext()
2025-03-05T18:30:18.393480083Z       --- End of stack trace from previous location ---
2025-03-05T18:30:18.393481114Z          at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.<InvokeInnerFilterAsync>g__Awaited|13_0(ControllerActionInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
2025-03-05T18:30:18.393482353Z          at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeNextResourceFilter>g__Awaited|25_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
2025-03-05T18:30:18.393487756Z          at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Rethrow(ResourceExecutedContextSealed context)
2025-03-05T18:30:18.393494665Z          at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
2025-03-05T18:30:18.393496120Z          at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.InvokeFilterPipelineAsync()
2025-03-05T18:30:18.393497237Z       --- End of stack trace from previous location ---
2025-03-05T18:30:18.393498716Z          at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeAsync>g__Awaited|17_0(ResourceInvoker invoker, Task task, IDisposable scope)
2025-03-05T18:30:18.393499898Z          at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeAsync>g__Awaited|17_0(ResourceInvoker invoker, Task task, IDisposable scope)
2025-03-05T18:30:18.393500997Z          at Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext context)
2025-03-05T18:30:18.393501974Z          at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context)
2025-03-05T18:30:18.393503057Z          at AgileConfig.Server.Apisite.Websocket.WebsocketHandlerMiddleware.Invoke(HttpContext context, IAppBasicAuthService appBasicAuth, IConfigService configService, IRegisterCenterService registerCenterService, IServiceInfoService serviceInfoService) in /src/AgileConfig.Server.Apisite/Websocket/WebsocketHandlerMiddleware.cs:line 123
2025-03-05T18:30:18.393504291Z          at AgileConfig.Server.Apisite.UIExtension.ReactUiMiddleware.Invoke(HttpContext context) in /src/AgileConfig.Server.Apisite/UIExtension/ReactUIMiddleware.cs:line 118
2025-03-05T18:30:18.393505393Z          at AgileConfig.Server.Common.ExceptionHandlerMiddleware.Invoke(HttpContext context) in /src/AgileConfig.Server.Common/ExceptionHandlerMiddleware.cs:line 27
2025-03-05T18:30:18.393506432Z          at AgileConfig.Server.Common.ExceptionHandlerMiddleware.Invoke(HttpContext context) in /src/AgileConfig.Server.Common/ExceptionHandlerMiddleware.cs:line 54
2025-03-05T18:30:18.393507465Z          at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpProtocol.ProcessRequests[TContext](IHttpApplication`1 application)

It seems Node Server's environment list is null. Any help is highly appreciated.

Thank you.

tanisman avatar Mar 05 '25 18:03 tanisman

by the way, other requests such as /api/App/{appId} works as expected on both nodes.

tanisman avatar Mar 05 '25 18:03 tanisman

Hi @tanisman Thanks for using agileconfig. It had a bug when a node is not adminconsole it can not init enviornment correctly. I just fix it now. You can update the image to latest or tag: v-1.9.12.

kklldog avatar Mar 07 '25 18:03 kklldog

Thanks for your hard work on AgileConfig!

tanisman avatar Mar 09 '25 23:03 tanisman