Loading...
Loading...
Senior Node.js developer. Use when building, reviewing, or refactoring Node.js applications. Enforces modern Node.js 22+ patterns, native APIs, performance, and production-ready practices.
npx skill4agent add ai-engineer-agent/ai-engineer-skills nodejs-expertimportexport"type": "module"package.json--experimental-strip-typestsxconstletvarasyncawaitfetch()node-fetchaxiosgotnode:testnode:assertnode --watchnodemonnode --env-file=.envdotenvcrypto.randomUUID()uuidstructuredClone()lodash.cloneDeeputil.parseArgs()yargscommanderWebSocketwsfs.glob()globAbortControllerAbortSignalnavigator.hardwareConcurrencyBlobFileFormDataResponseRequestproject/
├── src/
│ ├── index.ts # Entry point
│ ├── config.ts # Configuration (env parsing, validation)
│ ├── server.ts # HTTP server setup (separate from app logic)
│ ├── app.ts # Application setup (middleware, routes)
│ ├── routes/ # Route handlers grouped by domain
│ ├── services/ # Business logic layer
│ ├── repositories/ # Data access layer
│ ├── middleware/ # Custom middleware
│ ├── utils/ # Shared utilities
│ └── types/ # TypeScript type definitions
├── tests/
│ ├── unit/
│ └── integration/
├── package.json
├── tsconfig.json
└── node.config.js # Optional runtime configErrorcauseclass AppError extends Error {
constructor(message: string, public readonly code: string, options?: ErrorOptions) {
super(message, options);
this.name = 'AppError';
}
}
throw new AppError('User not found', 'USER_NOT_FOUND', { cause: originalError });unhandledRejectionuncaughtExceptionconst shutdown = async (signal: string) => {
console.log(`Received ${signal}, shutting down gracefully...`);
server.close();
await db.end();
process.exit(0);
};
process.on('SIGTERM', () => shutdown('SIGTERM'));
process.on('SIGINT', () => shutdown('SIGINT'));AbortSignal.timeout()server.closeAllConnections()worker_threadsStreamspipeline()node:stream/promisesAsyncLocalStoragenode:async_hookssetImmediate()Buffer.allocUnsafe()Pinonode --profnode --inspectperf_hookshttp.createServer()server.setTimeout()server.keepAliveTimeoutnode:clusterpm2server.headersTimeout > server.keepAliveTimeout--permissioneval()new Function()vm.runInContext()crypto.timingSafeEqual()child_processhelmetnpm auditnpm cinpm install--save-exactnode:cryptoimport { describe, it, mock, beforeEach } from 'node:test';
import assert from 'node:assert/strict';
describe('UserService', () => {
it('should create a user', async () => {
const result = await service.createUser({ name: 'Alice' });
assert.strictEqual(result.name, 'Alice');
});
});mock.method()mock.timers--experimental-test-coveragenode --test --watchnode --test 'tests/**/*.test.ts't.diagnostic()assert.snapshot()node --env-file=.envexport const config = Object.freeze({
port: parseInt(process.env.PORT ?? '3000', 10),
dbUrl: process.env.DATABASE_URL ?? 'postgres://localhost/myapp',
nodeEnv: process.env.NODE_ENV ?? 'development',
});process.envnode:22-slimUSER nodenodenpm startpackage.jsonpackage-lock.json.dockerignorenode_modules.gitrequire()node-fetchdotenvuuidnodemonfs.readFileSyncJSON.parse()package.jsonprocess.exit()console.logany@ts-ignore