@mango-power/node-kit
v1.2.2
Published
Shared node toolkit for mp services
Readme
@mango-power/node-kit
Shared Node.js toolkit for backend services.
Install
npm i @mango-power/node-kitModules
| Export | Description |
|--------|-------------|
| createLogger / AppLogger | Structured logger (JSON output) |
| PGClient | PostgreSQL connection pool — returns raw snake_case rows |
| RedisClient | Redis client (ioredis wrapper) |
| RmqService | RabbitMQ producer / consumer (amqplib wrapper) |
| SLSClient | Alibaba Cloud SLS (read & write) |
| OssClient | Alibaba Cloud OSS (ali-oss wrapper) |
| AwsS3Client | AWS S3 client (@aws-sdk/client-s3 wrapper) |
| OssClientConfig | Config type for OssClient / AwsS3Client |
| AwsMqttService / AliMqttService / EMQXMqttService | MQTT clients |
CHANGELOG
v1.0.0 ⚠️ Breaking Change
PGClient.query() / PGClient.queryOne() removed humps camelizeKeys — now returns raw PostgreSQL snake_case rows.
// Before (v0.x — auto camelCase)
const row = await pg.queryOne('SELECT user_id FROM account WHERE id = $1', [id]);
console.log(row.userId); // ✅
// After (v1.0+ — snake_case raw row)
const row = await pg.queryOne('SELECT user_id FROM account WHERE id = $1', [id]);
console.log(row.user_id); // ✅ use snake_case
// Or map in Repository.mapRow() to a typed Domain EntityLogger
import { createLogger } from '@mango-power/node-kit';
const logger = createLogger('ServiceName');
logger.info('event.name', { key: 'value' });
// Output: [2026-03-07T08:00:00Z] [ServiceName] event.name {"key":"value"}- Args order: message (string) first, then meta (object)
- Set
LOG_COMPACT=falseto enable pretty multi-line JSON output
PGClient
import { PGClient } from '@mango-power/node-kit';
const pg = new PGClient();
await pg.init({ host, port, database, username, password, max, ssl });
// Multi-row (snake_case raw rows)
const rows = await pg.query('SELECT id, created_at FROM account');
console.log(rows[0].created_at); // ✅
// Single row
const row = await pg.queryOne('SELECT * FROM account WHERE id = $1', [id]);
// Transaction
await pg.transaction(async (client) => {
await client.query('INSERT INTO ...');
await client.query('UPDATE ...');
});Returns raw PostgreSQL column names (snake_case). Map to camelCase Domain Entities in the Repository layer via
mapRow().
OssClient / AwsS3Client
import { OssClient, AwsS3Client, OssClientConfig } from '@mango-power/node-kit';
// Alibaba Cloud OSS
const oss = new OssClient();
await oss.init({ accessKeyId, accessKeySecret, bucket, region });
await oss.putObject('path/to/file.json', buffer);
const url = await oss.generateDownloadUrl('path/to/file.json', 'download.json');
// AWS S3
const s3 = new AwsS3Client();
await s3.init({ accessKeyId, accessKeySecret, bucket, region: 'us-west-1' });
await s3.putObject('path/to/file.bin', buffer);Build & Publish
npm run build # Compile TypeScript
npm run typecheck # Type-check only
npm run release # Publish to npm public registryEnsure npm is logged in:
registry=https://registry.npmjs.org/
//registry.npmjs.org/:_authToken=${NPM_TOKEN}