<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Roman Khegay</title>
    <description>The latest articles on DEV Community by Roman Khegay (@thekhegay).</description>
    <link>https://dev.to/thekhegay</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1566873%2Fc977401b-b6ca-4e2a-9388-a4fb6911ca49.jpg</url>
      <title>DEV Community: Roman Khegay</title>
      <link>https://dev.to/thekhegay</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/thekhegay"/>
    <language>en</language>
    <item>
      <title>My NestJS app "hung" on startup and printed nothing - it was dead all along</title>
      <dc:creator>Roman Khegay</dc:creator>
      <pubDate>Mon, 12 Oct 2026 12:30:16 +0000</pubDate>
      <link>https://dev.to/thekhegay/my-nestjs-app-hung-on-startup-and-printed-nothing-it-was-dead-all-along-4bhd</link>
      <guid>https://dev.to/thekhegay/my-nestjs-app-hung-on-startup-and-printed-nothing-it-was-dead-all-along-4bhd</guid>
      <description>&lt;p&gt;Few months ago I started one of my Nest services in watch mode and got... nothing. No error, no "Nest application successfully started", no stack. Terminal just sat there after "Watching for file changes". I was sure something hung on startup and spent good amount of time looking for deadlock that did not exist&lt;/p&gt;

&lt;p&gt;Real reason: Redis was not running (I forgot to start docker), and app was not hanging at all. It died in about half second and took all its logs with it&lt;/p&gt;

&lt;h2&gt;
  
  
  Setup
&lt;/h2&gt;

&lt;p&gt;Pretty standard one, mostly from docs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Nest + Fastify&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;nestjs-pino&lt;/code&gt; with &lt;code&gt;bufferLogs: true&lt;/code&gt; and &lt;code&gt;app.useLogger(app.get(Logger))&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Redis client created in module factory, with connection check&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;nest start --watch&lt;/code&gt; for local dev&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Redis factory looked roughly like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;provide&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;REDIS&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;inject&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;ConfigService&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="nx"&gt;useFactory&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ConfigService&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;redis&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Redis&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getOrThrow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;REDIS_URL&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;lazyConnect&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="nx"&gt;redis&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;error&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{});&lt;/span&gt; &lt;span class="c1"&gt;// errors handled below&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;redis&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Failed to connect to &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;REDIS_URL&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;redis&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  What actually happened
&lt;/h2&gt;

&lt;p&gt;Three things together:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;With docker off, host resolves to localhost and connection is refused right away. &lt;code&gt;connect()&lt;/code&gt; rejects in about 2 ms&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;bufferLogs: true&lt;/code&gt; keeps every log line in memory until app is ready, so pino logger from DI can print them in its format. My &lt;code&gt;logger.error&lt;/code&gt; went into that buffer too&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;process.exit(1)&lt;/code&gt; killed process before anything flushed buffer. Zero lines printed&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;And then &lt;code&gt;nest start --watch&lt;/code&gt; does not say anything when app exits on its own. It just keeps watching files. So silent exit looks exactly like hang&lt;/p&gt;

&lt;h2&gt;
  
  
  Where buffer is flushed (and where it is not)
&lt;/h2&gt;

&lt;p&gt;I checked this on Nest 11 and 12. Buffered logs are printed:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;after successful &lt;code&gt;init()&lt;/code&gt; (12.1.1+) or in &lt;code&gt;listen()&lt;/code&gt; callback&lt;/li&gt;
&lt;li&gt;when something throws while Nest builds modules, async factories included - exceptions zone flushes before exiting&lt;/li&gt;
&lt;li&gt;since Nest 12.1.3, when &lt;code&gt;init()&lt;/code&gt; rejects, for example async &lt;code&gt;onModuleInit&lt;/code&gt; throws&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;They are not printed:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;when factory calls &lt;code&gt;process.exit()&lt;/code&gt; itself - Nest has no &lt;code&gt;exit&lt;/code&gt; hook, so buffer dies with process. One &lt;code&gt;process.on('exit', () =&amp;gt; Logger.flush())&lt;/code&gt; in &lt;code&gt;main.ts&lt;/code&gt; would have printed my case&lt;/li&gt;
&lt;li&gt;when &lt;code&gt;onModuleInit&lt;/code&gt; never settles (db client retrying forever) - buffer waits for &lt;code&gt;init()&lt;/code&gt; to finish, so nothing that goes through Nest &lt;code&gt;Logger&lt;/code&gt; shows up. Only what client itself writes to console gets through&lt;/li&gt;
&lt;li&gt;when you stop such hung app with Ctrl+C - buffer is just dropped&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Before 12.1.3 failed &lt;code&gt;onModuleInit&lt;/code&gt; also lost every buffered line. Error itself still reached &lt;code&gt;.catch()&lt;/code&gt; in &lt;code&gt;main.ts&lt;/code&gt;, but if that catch logged through Nest &lt;code&gt;Logger&lt;/code&gt;, its line went into buffer too and nothing was printed at all. I had exactly that catch in my code for few weeks&lt;/p&gt;

&lt;p&gt;Docs said "If initialization fails, Nest flushes it right away", which was true only for module building. My fix for that is &lt;a href="https://github.com/nestjs/nest/pull/18111" rel="noopener noreferrer"&gt;nestjs/nest#18111&lt;/a&gt;, it shipped in Nest 12.1.3&lt;/p&gt;

&lt;p&gt;Docs now say wich startup failures buffer cannot report: &lt;a href="https://github.com/nestjs/docs.nestjs.com/pull/3611" rel="noopener noreferrer"&gt;nestjs/docs.nestjs.com#3611&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And small one to Nest CLI, so watch mode prints line when app exits instead of staying silent: &lt;a href="https://github.com/nestjs/nest-cli/pull/3623" rel="noopener noreferrer"&gt;nestjs/nest-cli#3623&lt;/a&gt;, still in review&lt;/p&gt;

&lt;h2&gt;
  
  
  What I do now
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Logger exists before Nest does.&lt;/strong&gt; Instead of buffering, I create pino-based logger myself and pass it to &lt;code&gt;NestFactory.create&lt;/code&gt;. Every line goes out immediately, including ones from module factories:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;bootstrap&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;void&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;logger&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createLogger&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;service&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;matchmaker&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt; &lt;span class="c1"&gt;// LoggerService on top of pino, no DI&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;NestFactory&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;AppModule&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;FastifyAdapter&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;abortOnError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;enableShutdownHooks&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;0.0.0.0&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nf"&gt;bootstrap&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="k"&gt;catch&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// exitCode alone is not enough if some client still holds event loop&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nest prints module building errors with that logger either way. &lt;code&gt;abortOnError: false&lt;/code&gt; only makes it rethrow instead of calling &lt;code&gt;process.exit(1)&lt;/code&gt; itself, so error also reaches &lt;code&gt;.catch()&lt;/code&gt;, where you can alert or clean up before exit. For failing &lt;code&gt;onModuleInit&lt;/code&gt; Nest does not log error at all, so &lt;code&gt;.catch()&lt;/code&gt; is only place where it shows up. And nothing here is bufered&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Throw, don't exit.&lt;/strong&gt; Factory that throws goes through Nest exception handling and gets printed. Factory that calls &lt;code&gt;process.exit()&lt;/code&gt; decides for Nest that nobody needs to know why&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;useFactory&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ConfigService&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;redis&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Redis&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getOrThrow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;REDIS_URL&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;lazyConnect&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;enableOfflineQueue&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;redis&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;redis&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;disconnect&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// otherwise client keeps reconnecting in background&lt;/span&gt;
    &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Nest prints it, buffer or not&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;redis&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;disconnect()&lt;/code&gt; matters: rejected &lt;code&gt;connect()&lt;/code&gt; does not stop ioredis, it keeps reconnecting, and with &lt;code&gt;abortOnError: false&lt;/code&gt; that timer keeps process alive forever&lt;/p&gt;

&lt;p&gt;&lt;code&gt;enableOfflineQueue: false&lt;/code&gt; matters too: with offline queue on, any command before connection just waits, so &lt;code&gt;await redis.get()&lt;/code&gt; in &lt;code&gt;onModuleInit&lt;/code&gt; sits there until retries run out (about 10 seconds with ioredis 5 defaults, more than minute on ioredis 6), and forever with &lt;code&gt;maxRetriesPerRequest: null&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Know which clients lie about connecting.&lt;/strong&gt; Prisma with MongoDB resolves &lt;code&gt;$connect()&lt;/code&gt; even when database is down, first real query then waits for server selection timeout (30 seconds by default). If you rely on &lt;code&gt;$connect()&lt;/code&gt; as health check, it will not tell you anything there&lt;/p&gt;

&lt;h2&gt;
  
  
  Short version
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;bufferLogs&lt;/code&gt; + &lt;code&gt;process.exit()&lt;/code&gt; in factory = zero output&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;bufferLogs&lt;/code&gt; + &lt;code&gt;onModuleInit&lt;/code&gt; that never settles = nothing from Nest &lt;code&gt;Logger&lt;/code&gt;, also on 12.1.3&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;bufferLogs&lt;/code&gt; + failing &lt;code&gt;onModuleInit&lt;/code&gt; + &lt;code&gt;.catch()&lt;/code&gt; logging through Nest &lt;code&gt;Logger&lt;/code&gt; = zero output before 12.1.3&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;nest start --watch&lt;/code&gt; stays quiet when app dies&lt;/li&gt;
&lt;li&gt;create logger before &lt;code&gt;NestFactory.create&lt;/code&gt;, throw instead of exit, disconnect client that failed&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Hope it saves someone hour or two of looking for hang that is not there&lt;/p&gt;

</description>
      <category>nestjs</category>
      <category>node</category>
      <category>logging</category>
      <category>debugging</category>
    </item>
  </channel>
</rss>
