nestjs 启动异常情况整理

当 NestJS 应用启动时遇到无异常提示的挂起问题,通常是由于代码错误导致。例如,未正确传递参数给 CustomDBLogger 实例,或者在 log 方法中缺少必要的执行语句。此外,通过 `npm install --production` 后直接执行 `node main.js` 报错,可能是因为缺少开发依赖。解决方法是先执行 `npm run build` 生成正确的 dist 文件后再启动。

1. 不报错,像是挂了空档

-正常的启动应该是下图这样的:

1.1 胡乱尝试

自以为是 node 或者 nest 框架的问题,进行了更换操作系统和包管理工具的场景(使用 yarn 运行之前要把 package-lock.json 删掉,否则安装过程中可能报错。)。

1. On Mac

Mac 的编译环境需要依赖于 xcode 工具。

$ xcode-select --install
xcode-select: error: command line tools are already installed, 
use "Software Update" to install updates

# 提示已经安装的话,就重置
$ xcode-select --reset

 npm install 和 yarn 都可以完成依赖包的安装

2. On Linux2

npm install 和 yarn 都可以完成依赖包的安装

3. On Ubuntu

npm install 和 yarn 都可以完成依赖包的安装

But!

-三种环境的启动结果都是一样的,如下图:

1.2 问题定位

nest new test-project

test-project 这个初始项目可以正常启动

用有问题的项目的 package.json 替换 test-project 项目中的 package.json,依然可以正常启动。

感觉不是 node 和 nest 的问题,可能是应用代码问题。

  • 错误代码一
import {NestFactory} from '@nestjs/core';
import {AppModule} from './app.module';
import {CustomDbLogger} from './_basic/_logger/_logger.service';
import {PrismaService} from './_basic/_prisma/_prisma.service';

async function bootstrap() {
  const app = await NestFactory.create(AppModule, {
    bufferLogs: true,
  });
  //app.useLogger(new CustomDbLogger(await new PrismaService()));
  app.useLogger(app.get(CustomDbLogger));

  // Listen port
  const port = process.env.PORT || 8080;
  await app.listen(port);
}
bootstrap();

app.useLogger(app.get(CustomDbLogger));

CustomDBLogger的实例化需要一个参数,而这里的写法没有传参。

  • 错误代码二

- log 方法中没有执行语句:

import {ConsoleLogger} from '@nestjs/common';

export class CustomLoggerService extends ConsoleLogger {
  // stdout
  debug(message: string) {
    super.debug(message, this.context);
  }

  log(message: string) {
    //super.log(message, this.context);
  }

  error(message: string) {
    super.error(message, this.context);
  }

  warn(message: string) {
    super.warn(message, this.context);
  }

  // stdout
  verbose(message: string) {
    super.verbose(message, this.context);
  }
}

- log 方法中有super.log:

{
...
  log(message: string) {
    super.log(message, this.context);
  }
...
}

 - log 方法中有 super.error:

{
...
  log(message: string) {
    super.error(message, this.context);
  }
...
}

 问题的原因是,main.ts 中的 app.useLogger 需要使用 log 方法输出启动日志,如果 log 方法有问题就会导致启动时无任何信息输出的现象。

2. npm install --production 后执行 node main.js 报错

2.1 疑问

npm install --production 执行完已经生成了 dist 文件,难道这些 dist 文件的生成方式与 npm run build 的生成方式不同吗?

2.2 解决方法

执行 npm run build 后再执行 node main.js,就可以正常启动了。

 

 

 

NestJS是一个基于TypeScript和Node.js的现代全功能JavaScript框架。它专为构建高性能、模块化的API而设计。为了启动一个NestJS项目并运行微服务,你需要首先确保已经安装了Node.js环境。 ### 安装 NestJS 如果你还没有安装 `@nestjs/cli` 工具,可以使用以下命令全局安装: ```bash npm install -g @nestjs/cli ``` 或者如果你更倾向于使用Yarn: ```bash yarn global add @nestjs/cli ``` ### 创建新项目 创建一个新的NestJS项目,可以在终端输入以下命令,并按照提示操作: ```bash nest new my-project-name cd my-project-name ``` 这里 `"my-project-name"` 应该替换为你想要的项目名称。 ### 启动微服务 在创建完项目并且配置好依赖之后,你可以通过以下命令启动你的微服务: ```bash npm start:dev 或 yarn start:dev ``` 这里的 `start:dev` 表示以开发模式启动应用,这意味着应用会自动重启每次文件更改发生时,非常适合于开发阶段。 如果想以生产模式部署,使用: ```bash npm run start 或 yarn start ``` 这将启动一个无刷新机制的应用,适合于生产环境。 ### 相关问题: 1. **如何配置NestJS项目?** 答案通常涉及设置环境变量、数据库连接、中间件、路由等。NestJS官方文档提供了详细的指导和示例。 2. **NestJS项目的结构是什么样的?** NESTJS项目通常包括公共库、服务层、控制器、提供者等多个部分,每个部分都服务于特定目的,如基础业务逻辑、HTTP API、依赖注入等。 3. **如何处理错误和异常NestJS中?** NESTJS提供了强大的错误处理机制,包括自定义异常处理器、中间件等,可以帮助开发者优雅地处理各种类型的错误情况。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值