reactjs.net - ошибка "обнаружен переполнение стека"

Поскольку я решил переключиться на рендеринг на стороне сервера от реакции на стороне клиента, я начал создавать свои компоненты и использовать их в приложении.

Однако я столкнулся с этой ошибкой:

Unknown error (RangeError); potential stack overflow detected

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: Microsoft.ClearScript.ScriptEngineException: Unknown error (RangeError); potential stack overflow detected

И это часть от stack-trace

[ScriptEngineException: Unknown error (RangeError); potential stack overflow detected]
   V8Exception.ThrowScriptEngineException(V8Exception* ) +169
   Microsoft.ClearScript.V8.V8ContextProxyImpl.Execute(String gcDocumentName, String gcCode, Boolean evaluate, Boolean discard) +462
   Microsoft.ClearScript.V8.<>c__DisplayClass1b.<Execute>b__19() +197
   Microsoft.ClearScript.ScriptEngine.ScriptInvoke(Func`1 func) +70
   Microsoft.ClearScript.V8.V8ScriptEngine.BaseScriptInvoke(Func`1 func) +49
   Microsoft.ClearScript.V8.<>c__DisplayClass25`1.<ScriptInvoke>b__24() +45
   Microsoft.ClearScript.V8.?A0x792c8756.LockCallback(Void* pvArg) +9
   Microsoft.ClearScript.V8.V8ContextProxyImpl.InvokeWithLock(Action gcAction) +176
   Microsoft.ClearScript.V8.V8ScriptEngine.ScriptInvoke(Func`1 func) +118
   Microsoft.ClearScript.V8.V8ScriptEngine.Execute(String documentName, String code, Boolean evaluate, Boolean discard) +118
   JavaScriptEngineSwitcher.V8.V8JsEngine.InnerEvaluate(String expression) +89

Так что я не знаю, что вызывает эту ошибку, но я думаю, что это какой-то код, который зацикливается или что-то подобное. Кроме того, если я обновляю страницу, эта ошибка исчезает, и если я продолжаю интенсивно обновлять ее, она снова появляется, что очень расстраивает.

2 ответа

Решение

Это известная проблема, см. https://github.com/reactjs/React.NET/issues/190

Обходной путь - не использовать V8 для рендеринга, т. Е.

app.UseReact(config =>
        {
            config
                // ..other configuration settings
                .SetAllowMsieEngine(true);
        });

Я получал ту же ошибку (веб-приложение в Azure), и после некоторых исследований и тестов установка SetAllowMsieEngine в значение true фактически устранила проблему и для меня.

Как сказал Люк МакГрегор, это похоже на проблему с V8ScriptEngine, и использование SetAllowMsieEngine делает эту работу, однако этот метод является последней версией act.net, он устарел и рекомендуется для "управляемого в конфигурации JavaScriptEngineSwitcher".

Таким образом, решение, которое я нашел до сих пор, состоит в том, чтобы переключить JS Engine Switcher, установив его непосредственно в коде:

JsEngineSwitcher engineSwitcher = JsEngineSwitcher.Instance;
engineSwitcher.EngineFactories
    .AddChakraCore()
    .AddMsie( new MsieSettings() { EngineMode = JsEngineMode.Auto } );

engineSwitcher.DefaultEngineName = ChakraCoreJsEngine.EngineName;

Таким образом, я использую движок ChakraCore, а не V8 по умолчанию, который вызывал ошибку.

До сих пор во время наших тестов производительности с 250 одновременными запросами у нас больше не было этой ошибки, когда ранее в тех же условиях наверняка эта ошибка произошла.

Другие вопросы по тегам