npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

g-modules

v0.0.19

Published

``` npm install g-modules ```

Downloads

6

Readme

G Basic Nest Node_Modules

Install

npm install g-modules

Test

npm run test

查看测试覆盖率

npm run test:cov

日志使用

  • 在main.ts头部引用并初始化
import {Logger} from 'g-modules' 
new Logger('Demo测试') //input your Service Name 

所有的日志文件会生成在src/logs目录下面

  • 全局引用中间件LogInputMiddleware

    该中间件有两个功能:
    * 在请求上下文中,给req添加logger属性,开发人员可以通过req.logger来输出日志
    * 在每个请求中,打印请求路由&&请求参数日志,方便后续查找问题
    * 日志目录: /logs
    * 日志格式结构:

interface FormatOptions {
    message: string;
    level: string;
    label: string;
    timestamp: string;
    module?: string;
    requestId?: string;
    error?: Error;
}

用法如下:
在app.module.ts中AppModule添加配置信息

import { Module, MiddlewareConsumer, RequestMethod } from '@nestjs/common';
import {LogInputMiddleware} from 'g-modules' 
export class AppModule {
  configure(consumer: MiddlewareConsumer) {
    consumer
      .apply(LogInputMiddleware)
      .forRoutes({    
        path: '*',
        method: RequestMethod.ALL,  // 针对所有路由
      });
  }
}

在后续的路由请求中,可以调用 req.logger中的如下四个方法

   * info(message:string,options?: IOptions)  
   * debug(message:string,options?: IOptions)  
   * warn(message:string,options?: IOptions)  
   * error(message:Error,options?: IOptions)  

IOptions结构为:

interface IOptions {
 module?: string;  //模块名
 requestId?: string;  //请求id
}

G错误类

Nest.js有内置的错误类供开发人员使用,具体请看 但是对于企业来说,这些远远不够,所以G提供了GaiaException额外的一些错误定义。具体实现如下:

export class GaiaException extends Error {
    statusCode: number;
    constructor(code: number, msg?: any) {
        super();
        this.statusCode = code;
        this.message = msg || errMsg[code];
    }
}

export enum GaiaErrorCode {
    ParamsError = 10001,
    RoleError = 10002,
}

const errMsg = {
    10001: 'Param Error',
    10002: 'Role Error',
};

后续如需添加,请联系组件库成员添加。
具体使用方法:

import { GaiaException,GaiaErrorCode } from 'g-modules';
throw new GaiaException(GaiaErrorCode.RoleError);
//或者 自定义消息
throw new GaiaException(GaiaErrorCode.ParamsError, 'some errors');

用户角色认证(看守器)

此组件用于判定请求路由是否有权限进行访问,是根据header中的roles字段判断的
用法:

  • 在需要添加角色认证的模块(.module.ts)文件中添加:
import { RolesGuard } from 'g-modules';
import { APP_GUARD } from '@nestjs/core';
@Module({
  providers: [
    {
      provide: APP_GUARD,
      useClass: RolesGuard,
    },
  ],
})
  • 在路由前面添加装饰器 @SetMetadata,例如:
    @Post('/create')
    @SetMetadata('roles', ['admin']) // 第一个参数代表取的角色字段,第二个参数代表该路由允许访问的角色数组
    async create(@Body() userDto: UserDto) {
        const result = this.usersService.create(userDto);
        return result;
    }

异常过滤器(filter)

此组件用于过滤错误,并且记录错误日志以及统一能获取到上下文的错误(有req,res)的返回格式:

{
      statusCode: number,
      message: string,
      time: new Date(),
      path: request.url || '',
}
// Example:
{
    "statusCode": 10002,
    "message": "Role Error",
    "time": "2019-06-27T01:42:09.282Z",
    "path": "/user/create"
}

使用方式(在main.ts中全局添加):

import { AllExceptionsFilter } from 'g-modules';
async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  app.useGlobalFilters(new AllExceptionsFilter()); //全局添加
  await app.listen(3000, () => {});
}

拦截器(interceptor)

  • 请求时间记录
    该组件如名字所示,会记录该次业务处理的时间,如接口相应时间超过200ms,则以warn形式打印日志,需要优化,使用方式(main.ts全局引用):
import { RequestTimeInterceptor } from 'g-modules';
async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  app.useGlobalInterceptors(new RequestTimeInterceptor()//全局添加
  await app.listen(3000, () => {});
}
  • 请求返回数据格式统一
    现实开发过程中,我们需要统一正确的返回值格式,运用此拦截器可使返回值格式为:
{
   statusCode: 200,
   data: any,
   time: new Date()
}

使用方式:

import { TransformInterceptor } from 'g-modules';
async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  app.useGlobalInterceptors(new TransformInterceptor()//全局添加
  await app.listen(3000, () => {});
}

注意:因为graphql的请求返回格式是自定义的,所以该拦截器不会统一graphql的接口返回格式

参数验证(pipe)

日常开发中,前后端往往会定义接口的入参结构,该组件用于验证前端的传入参数。如若多传会被pass(安全性),如若少传或者结构类型错误,都会返回错误。 用法如下(main.ts全局引用):

import { ValidationPipe } from 'g-modules';
async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  app.useGlobalPipes(new ValidationPipe());//全局添加
  await app.listen(3000, () => {});
}

注意: 此组件是配合class-validator用的,具体用法可去github查看