Emitted when a command is started, before the initial HTTP request is made.

Note that these emit real commands, not any abstracted commands like "insertMany" or "updateMany", which may be split into multiple of those commands under the hood.

See CommandEvent for more information about all the common properties available on this event.

Hierarchy (view full)

Constructors

Properties

_propagationState: PropagationState
command: Record<string, any>

The command object. Equal to the response body of the HTTP request.

Note that this is the actual raw command object; it's not necessarily 1:1 with methods called on the collection/db.

Example

{
  insertOne: { document: { name: 'John' } }
}
commandName: string

The command name.

This is the key of the command object. For example, if the command object is { insertOne: { document: { name: 'John' } } }, the command name is insertOne.

extraLogInfo: undefined | Record<string, any>

Any extra information that may be useful for debugging.

keyspace: null | string

The keyspace the command is being run in.

name: string

The name of the event (e.g., 'CommandStarted', 'CommandFailed').

Poor man's sealed class. See BaseClientEvent.permits for more info.

requestId: string
Overview

A unique identifier for the request that triggered this event.

It helps correlate multiple events occurring within the same request lifecycle.

Disclaimer

High-level operations, such as collection.insertMany(...), may generate multiple requests internally. Each of these requests will have its own unique requestId.

Example

As an example, a CommandStarted event may be emitted when a command is started, and a CommandSucceeded event may be emitted when the command has succeeded. Both of these events will have the same requestId.

If logged to a file (e.g. winston with a file transport and json format), you could then filter all events with the same requestId to see the entire lifecycle of a single command.

Example

// Set up event listeners on the collection
collection.on('commandStarted', (e) => {
console.log(`Command started with requestId: ${e.requestId}`);
});
collection.on('commandSucceeded', (e) => {
console.log(`Command succeeded with requestId: ${e.requestId}`);
});

// Logs:
// - Command started with requestId: dac0d3ba-79e8-4886-87b9-20237c507eba
// - Command succeeded with requestId: dac0d3ba-79e8-4886-87b9-20237c507eba
await collection.insertOne({ name: 'Alice' });

// Logs:
// - Command started with requestId: 1fe46a92-8187-4eaa-a3c2-80a964b68eba
// - Command succeeded with requestId: 1fe46a92-8187-4eaa-a3c2-80a964b68eba
await collection.insertOne({ name: 'Bob' });
source?: string

The table/collection the command is being run on, if applicable.

The target of the command.

timeout: Partial<TimeoutDescriptor>

The timeout for the command, in milliseconds.

timestamp: Date

The timestamp of when the event was created.

url: string

The URL the command is being sent to.

formatVerboseTransientKeys: (keyof CommandEvent)[] = ...

Methods

  • Overview

    Converts the event to a verbose JSON format, as it would be logged to stdout:verbose/stderr:verbose (if enabled).

    Useful for debugging. The output is pretty-printed JSON with newlines, so perhaps not ideal for structured logging though.

    Returns string

    A JSON string with full event details.

  • Overview

    Stops the event from bubbling up to the parent listener (e.g. CollectionDbDataAPIClient) and prevents any further listeners from being called.

    Returns void

    Example

    db.on('commandStarted', (e) => {
    console.log('Command started (db listener)');
    });

    collection.on('commandStarted', (e) => {
    console.log('Command started (collection listener #1)');
    e.stopImmediatePropagation();
    });

    collection.on('commandStarted', (e) => {
    console.log('Command started (collection listener #2)');
    });

    // Logs:
    // - Command started (collection listener #1)
    collection.insertOne({ name: 'Alice' });

    See

    stopPropagation

  • Overview

    Stops the event from bubbling up to the parent listener (e.g. CollectionDbDataAPIClient).

    Returns void

    Example

    client.on('commandStarted', (e) => {
    console.log('Command started (client listener)');
    });

    db.on('commandStarted', (e) => {
    console.log('Command started (db listener)');
    e.stopPropagation();
    });

    collection.on('commandStarted', (e) => {
    console.log('Command started (collection listener)');
    });

    // Logs:
    // - Command started (collection listener)
    // - Command started (db) listener
    collection.insertOne({ name: 'Alice' });

    See

    stopImmediatePropagation

  • Overview

    Sets the default formatter for all events.

    Useful especially if you want to change the format of events as they're logged to stdout/stderr (see LoggingOutputs).

    See EventFormatter for much more info.

    Disclaimer

    This method sets a static property on the class, so it will affect all instances of BaseClientEvent, regardless of the class. Be careful when using this method in a shared environment.

    Parameters

    • formatter: EventFormatter

      A function that transforms an event into a log string.

    Returns void

    Example

    BaseClientEvent.setDefaultFormatter((event, msg) => `[${event.name}] ${msg}`);