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

md_egg

v1.0.0

Published

egg

Downloads

7

Readme

配置:

// config/plugin.js
'use strict';

exports.routerPlus = {
	enable: true,
	package: 'egg-router-plus',
};

exports.cors = {
	enable: true,
	package: 'egg-cors',
};

exports.tracer = {
	enable: true,
	package: 'egg-tracer',
};

exports.prometheus = {
	enable: true,
	package: 'egg-prometheus',
};

exports.mdEgg = {
	enable: true,
	package: 'mdEgg',
};

Context:

1. 重写 curl 方法,在 response headers 中自动写入网关请求的 x-request-id,实现链路追踪;

2. 添加 isLogin 方法,调用公司的 sso 接口,验证用户登陆。本方法应在 Controller 中的业务逻辑之前调用才能拦截请求,防止未登陆用户进行操作。例如

class HomeController extends Controller {
	async index() {
		const { ctx } = this;
		//验证登陆,未登陆则直接响应401,不处理后续逻辑
		await ctx.isLogin();
		ctx.body = 'hi, egg';
	}
}

3.添加 validate 方法,使用async-validator做参数校验,用法如下:

在 app/shemas 中添加相应规则,一般是一个 controller 对应一个文件夹,文件夹下一个 js 文件对应 controller 的一个方法。规则配置如下:

{
  id: [
    { required: true, message: 'id必传' },
    { type: 'number', message: 'id必须为数字'},
    ...
  ]
  ...
}

请求参数不符合规则时将返回 200 和错误 code 码-1,以及所有的不合法参数的 message 信息。
定制高级规则可参考async-validator文档。
使用时在 controller 中业务逻辑前调用 ctx.validate 方法验证参数,例如:

class UserController extends Controller {
  async index() {
    const { ctx, { ctx: { request:  { query } } } } = this;
    //验证登陆,未登陆则直接响应401,不处理后续逻辑
    await ctx.isLogin();
    //验证参数,参数不合法则直接响应400,不处理后续逻辑
    await ctx.validate('user.user', query);
    ctx.body = 'hi, egg';
  }
}

Helper

1. 添加 sign 方法,公司统一签名算法的 nodejs 实现,使用方法

const signedData = ctx.helper.sign(data, appkey, appSecret);

2. 添加 success error 统一输出

    success({ code, status, message, data }) {
        this.ctx.status = status || 200;
        this.ctx.body = {
            code: code || 0,
            message: message || '请求成功',
            data: data || {},
        };
    },

2.添加 excel 工具函数和基本的文件流操作函数:

(1).jsonToSheet: 用于将 json 转换为 excel 的 sheet 格式;
(2).jsontoWb: 用于有 json 生成 workbook。
实际使用案例如下:

// npm i xlsx
// https://www.npmjs.com/package/xlsx
// in controller
const XLSX = require('xlsx');
//... 路由方法中
const excelHeader = { id: '仓库ID', name: '仓库名称', lng: '经度', lat: '纬度', address: '详细地址' };
const excelData = [
	{ id: '100', name: '北京仓库', lng: '100', lat: '99', address: '诺金中心' },
	{ id: '200', name: '上海仓库', lng: '200', lat: '88', address: '东方明珠' },
];
const wb = helper.jsonToWb(excelHeader, excelData);
const excelBuf = XLSX.write(wb, { type: 'buffer', bookType: 'xlsx', compression: true });
ctx.attach('仓库信息表.xlsx', excelBuf);

*注: 两个方法均接受 excelheader,excelData 两个参数,分别表示 excel 表头和数据
(3).attach: 用于接口返回文件附件,如上的 excel 文件。接受文件名(最好包含格式后缀,如.xlsx), 文件 stream 或 buffer 两个参数

Middleware

1.logger:

统一处理后续 middleware 的中的 reponse 和 error,并统一写入日志。 并且可配置特殊 router 不打印日志,配置和 eggjs 内置 logger 不冲突。如下:

// 自定义日志路径及文件名称
config.logger = {
	// 忽略路由日志
	ignoreRouter: ['/healthCheck', '/readinessCheck'],
	level: 'INFO',
	dir: '/med/log/apps',
	// 应用相关日志
	appLogName: 'egg-plugin-test-web.log',
	// 框架、插件相关日志
	coreLogName: 'egg-plugin-test-core.log',
	// agent进程日志
	agentLogName: 'egg-plugin-test-agent.log',
	// logger.error输出位置
	errorLogName: 'egg-plugin-test-error.log',
};

2.cors:

// config.dev.js
config.mdEgg = {
	cors: ['.guazi-cloud.conm'],
};

Schedule

日志定时切割模块,每日固定时间将日志文件进行切割,防止文件过大。引入就行,无需关注。

Service

1. validateToken 方法调用公司 sso 接口

2. event_logger:

(1).http_client: 添加 app.httpclient 的事件监听,实现调用 ctx.curl 方法时自动打印日志, 默认启用。
(2).rpc_client: 添加 app.rpcClient 的事件监听,实现调用 ctx.proxy 的 rpc 方法时自动打印日志, 默认不启用,当使用 egg rpc 时自动启用。

3. tracer:

自动处理网关请求 header 中 x-request-id 实现链路追踪

App 感谢少东

接入prometheus,当启用egg-prometheus插件时,自动加入特定的 metrics 供 promtheus 收集。主要支持且较具参考价值的 metrics 有:

1.httpresponse_time_ms: 路由请求处理时间
2.http_request_total: 路由请求计数
3.http_request_rate: 路由请求计数
4.http_request_error_total: 错误请求计数 5.rpc_consumer_request_rate: rpc consumer 调用计数
6.rpc_consumer_request_total: rpc consumer 调用计数
7.rpc_consumer_fail_response_time_ms: rpc consumer 调用响应时间
8.rpc_provider_request_rate: rpc provider 调用计数
9.rpc_provider_request_total: rpc provider 调用计数
10.rpc_provider_fail_response_time_ms: rpc provider 调用响应时间
11.nodejs_eventloop_lag_seconds: 事件循环时钟
12.nodejs_heap_size
[used|total]bytes,nodejs_external_memory_bytes: 堆内存使用情况
13.nodejs_heap_space_size
[total|used|available]bytes: 堆空间使用情况
14.process_cpu
[use|system]_seconds_total: Cpu 使用情况
15.process_open_fds: 文件句柄数统计

初步接入prometheusgrafana(公司地址)看板雏形效果如下:

定制指标请根据实际需求使用以上 metrics,参考promql文档进行配置。

*注: 可参考egg-prometheus定制特殊需求的 metrics 并在 app.js 上挂载;
若要实现路由标签的统计,在写 router 时须传入标签参数,如:

// router/home.js
// 分文件夹路由须启用egg-router-plus插件
module.exports = app => {
	const { controller } = app;
	const subRouter = app.router.namespace('/test');

	subRouter.get('主页', '/home', controller.home.index);
};

Config

default

1.启用 lib/tracer; 2.logger: medusa 日志规范配置;
接入kibana后效果如下:

*_注:logger 中 app 字段默认读取 package.json 里的 name,如 egg-demo

3.prometheus 配置:

config.prometheus = {
	// prometheus协议监听端口
	scrapePort: 7008,
	// prometheus协议uri
	scrapePath: '/prometheus',
	// prometheus cluster模式监听端口,可以不传,默认6789
	aggregatorPort: 7009,
	// 写入metrics的标签,便于做业务过滤
	defaultLabels: { biz: 'tracker 版控' },
};