mirror of
https://github.com/aspnet/JavaScriptServices.git
synced 2025-12-23 01:58:29 +00:00
committed by
Steve Sanderson
parent
ee601bed50
commit
0c09c68b77
@@ -27,16 +27,6 @@ namespace Microsoft.AspNetCore.NodeServices.HostingModels
|
|||||||
protected readonly ILogger OutputLogger;
|
protected readonly ILogger OutputLogger;
|
||||||
|
|
||||||
private const string ConnectionEstablishedMessage = "[Microsoft.AspNetCore.NodeServices:Listening]";
|
private const string ConnectionEstablishedMessage = "[Microsoft.AspNetCore.NodeServices:Listening]";
|
||||||
private const string DebuggingStartedMessageFormat = @"-----
|
|
||||||
*** Node.js debugging is enabled ***
|
|
||||||
{0}
|
|
||||||
|
|
||||||
To debug, run:
|
|
||||||
node-inspector{1}
|
|
||||||
|
|
||||||
If you haven't yet installed node-inspector, you can do so as follows:
|
|
||||||
npm install -g node-inspector
|
|
||||||
-----";
|
|
||||||
private readonly TaskCompletionSource<object> _connectionIsReadySource = new TaskCompletionSource<object>();
|
private readonly TaskCompletionSource<object> _connectionIsReadySource = new TaskCompletionSource<object>();
|
||||||
private bool _disposed;
|
private bool _disposed;
|
||||||
private readonly StringAsTempFile _entryPointScript;
|
private readonly StringAsTempFile _entryPointScript;
|
||||||
@@ -215,8 +205,8 @@ If you haven't yet installed node-inspector, you can do so as follows:
|
|||||||
/// <param name="projectPath">The root path of the project. This is used when locating Node.js modules relative to the project root.</param>
|
/// <param name="projectPath">The root path of the project. This is used when locating Node.js modules relative to the project root.</param>
|
||||||
/// <param name="commandLineArguments">Command-line arguments to be passed to the Node.js process.</param>
|
/// <param name="commandLineArguments">Command-line arguments to be passed to the Node.js process.</param>
|
||||||
/// <param name="environmentVars">Environment variables to be set on the Node.js process.</param>
|
/// <param name="environmentVars">Environment variables to be set on the Node.js process.</param>
|
||||||
/// <param name="launchWithDebugging">If true, passes a flag to the Node.js process telling it to accept V8 debugger connections.</param>
|
/// <param name="launchWithDebugging">If true, passes a flag to the Node.js process telling it to accept V8 Inspector connections.</param>
|
||||||
/// <param name="debuggingPort">If debugging is enabled, the Node.js process should listen for V8 debugger connections on this port.</param>
|
/// <param name="debuggingPort">If debugging is enabled, the Node.js process should listen for V8 Inspector connections on this port.</param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
protected virtual ProcessStartInfo PrepareNodeProcessStartInfo(
|
protected virtual ProcessStartInfo PrepareNodeProcessStartInfo(
|
||||||
string entryPointFilename, string projectPath, string commandLineArguments,
|
string entryPointFilename, string projectPath, string commandLineArguments,
|
||||||
@@ -226,7 +216,7 @@ If you haven't yet installed node-inspector, you can do so as follows:
|
|||||||
string debuggingArgs;
|
string debuggingArgs;
|
||||||
if (launchWithDebugging)
|
if (launchWithDebugging)
|
||||||
{
|
{
|
||||||
debuggingArgs = debuggingPort != default(int) ? $"--debug={debuggingPort} " : "--debug ";
|
debuggingArgs = debuggingPort != default(int) ? $"--inspect={debuggingPort} " : "--inspect ";
|
||||||
_nodeDebuggingPort = debuggingPort;
|
_nodeDebuggingPort = debuggingPort;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -389,10 +379,13 @@ If you haven't yet installed node-inspector, you can do so as follows:
|
|||||||
{
|
{
|
||||||
if (evt.Data != null)
|
if (evt.Data != null)
|
||||||
{
|
{
|
||||||
if (IsDebuggerListeningMessage(evt.Data))
|
if (IsDebuggerMessage(evt.Data))
|
||||||
{
|
{
|
||||||
var debugPortArg = _nodeDebuggingPort.HasValue ? $" --debug-port={_nodeDebuggingPort.Value}" : string.Empty;
|
OutputLogger.LogWarning(evt.Data);
|
||||||
OutputLogger.LogWarning(string.Format(DebuggingStartedMessageFormat, evt.Data, debugPortArg));
|
}
|
||||||
|
else if (IsWarning(evt.Data))
|
||||||
|
{
|
||||||
|
OutputLogger.LogWarning(evt.Data);
|
||||||
}
|
}
|
||||||
else if (!initializationIsCompleted)
|
else if (!initializationIsCompleted)
|
||||||
{
|
{
|
||||||
@@ -411,9 +404,17 @@ If you haven't yet installed node-inspector, you can do so as follows:
|
|||||||
_nodeProcess.BeginErrorReadLine();
|
_nodeProcess.BeginErrorReadLine();
|
||||||
}
|
}
|
||||||
|
|
||||||
private static bool IsDebuggerListeningMessage(string message)
|
private static bool IsDebuggerMessage(string message)
|
||||||
{
|
{
|
||||||
return message.StartsWith("Debugger listening ", StringComparison.OrdinalIgnoreCase);
|
return message.StartsWith("Debugger attached", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
message.StartsWith("Debugger listening ", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
message.StartsWith("To start debugging", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
message.Contains("chrome-devtools:");
|
||||||
|
}
|
||||||
|
|
||||||
|
private static bool IsWarning(string message)
|
||||||
|
{
|
||||||
|
return message.StartsWith("Warning:", StringComparison.OrdinalIgnoreCase);
|
||||||
}
|
}
|
||||||
|
|
||||||
private FileSystemWatcher BeginFileWatcher(string rootDir)
|
private FileSystemWatcher BeginFileWatcher(string rootDir)
|
||||||
|
|||||||
@@ -788,14 +788,14 @@ Caveats:
|
|||||||
|
|
||||||
## Debugging your JavaScript/TypeScript code when it runs on the server
|
## Debugging your JavaScript/TypeScript code when it runs on the server
|
||||||
|
|
||||||
When you're using NodeServices or the server-side prerendering feature included in the project templates in this repo, your JavaScript/TypeScript code will execute on the server in a background instance of Node.js. You can enable debugging on that Node.js instance. Here's how to do it.
|
When you're using NodeServices or the server-side prerendering feature included in the project templates in this repo, your JavaScript/TypeScript code will execute on the server in a background instance of Node.js. You can enable debugging via [V8 Inspector Integration](https://nodejs.org/api/debugger.html#debugger_v8_inspector_integration_for_node_js) on that Node.js instance. Here's how to do it.
|
||||||
|
|
||||||
First, in your `Startup.cs` file, in the `ConfigureServices` method, add the following:
|
First, in your `Startup.cs` file, in the `ConfigureServices` method, add the following:
|
||||||
|
|
||||||
```
|
```
|
||||||
services.AddNodeServices(options => {
|
services.AddNodeServices(options => {
|
||||||
options.LaunchWithDebugging = true;
|
options.LaunchWithDebugging = true;
|
||||||
options.DebuggingPort = 5858;
|
options.DebuggingPort = 9229;
|
||||||
});
|
});
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -803,21 +803,20 @@ Now, run your application from that command line (e.g., `dotnet run`). Then in a
|
|||||||
|
|
||||||
In the console, you should see all the normal trace messages appear, plus among them will be:
|
In the console, you should see all the normal trace messages appear, plus among them will be:
|
||||||
|
|
||||||
-----
|
```
|
||||||
*** Node.js debugging is enabled ***
|
warn: Microsoft.AspNetCore.NodeServices[0]
|
||||||
Debugger listening on port 5858
|
Debugger listening on port 9229.
|
||||||
|
warn: Microsoft.AspNetCore.NodeServices[0]
|
||||||
|
Warning: This is an experimental feature and could change at any time.
|
||||||
|
warn: Microsoft.AspNetCore.NodeServices[0]
|
||||||
|
To start debugging, open the following URL in Chrome:
|
||||||
|
warn: Microsoft.AspNetCore.NodeServices[0]
|
||||||
|
chrome-devtools://devtools/bundled/inspector.html?experiments=true&v8only=true&ws=127.0.0.1:9229/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
|
||||||
|
```
|
||||||
|
|
||||||
To debug, run:
|
As per instructions open the URL in Chrome. Alternatively you can go to the `Sources` tab of the Dev Tools (at http://localhost:5000) and connect to the Node instance under `Threads` in the right sidebar.
|
||||||
node-inspector
|
|
||||||
|
|
||||||
If you haven't yet installed node-inspector, you can do so as follows:
|
|
||||||
npm install -g node-inspector
|
|
||||||
-----
|
|
||||||
|
|
||||||
In some other command line window, follow those instructions (i.e., install `node-inspector` as it describes, then run `node-inspector`). Then you can open a browser at `http://127.0.0.1:8080/?port=5858` and you'll see the debugger UI.
|
By expanding the `webpack://` entry in the sidebar, you'll be able to find your original source code (it's using source maps), and then set breakpoints in it. When you re-run your app in another browser window, your breakpoints will be hit, then you can debug the server-side execution just like you'd debug client-side execution. It looks like this:
|
||||||
|
|
||||||
By expanding the `webpack://` entry in the sidebar, you'll be able to find your original TypeScript code (it's using source maps), and then set breakpoints in it. When you re-run your app in another browser window, your breakpoints will be hit, then you can debug the server-side execution just like you'd debug client-side execution. It looks like this:
|

|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
(Note: although this looks like Chrome's native debugger for client-side code, it is actually a JavaScript-powered debugger UI that's connected to the server-side runtime)
|
|
||||||
|
|||||||
Reference in New Issue
Block a user