유용한 npm 라이브러리 리스트를 적어둔 문서. 내가 정리해둔 문서가 있다면 제목에 링킹을 해두었다.
환경 변수를 .env 파일에서 설정한대로 설정해주는 라이브러리
require('dotenv').config({ override: true })
아래 순서로 덮어쓰기 방식으로 process.env 프로퍼티 값을 설정한다.
.env => .env.local => .env.${NODE_ENV} => .env.${NODE_ENV}.local
.env.local 파일은 ${NODE_ENV} 값이 설정됐을 때 완전 대체되기를 권장한다. 즉, .env.local 파일은 정말 local에서만 사용.
dotenv-flow는 dotenv와 마찬가지로 CLI에서 설정된 값을 오버라이딩하지 않는다.
NODE_ENV 환경변수 핸들링NODE_ENV가 다음의 값을 갖는다고 해보자
local-test: 로컬에서 테스트하는 환경qa: QA 환경production: 실제 애플리케이션 운영 환경local-test 이외의 환경변수들은 도커 등을 이용해서 배포하는 과정에서 NODE_ENV를 비롯한 기타 환경변수를 주입받는다고 하자. 그렇담 로컬 테스트 환경에서만 NODE_ENV값을 local-test으로 잘 설정해주면 된다.
이것을 dotenv-flow를 이용하자면,
.env: 모든 환경에서 공통으로 사용되는 환경변수를 설정하고, 여기에서 NODE_ENV=local-test로 설정한다. 이미 설정된 환경변수에 대해서 오버라이딩을 허용하지 않으니, 의도한대로 로컬 테스트환경에서만 해당 값이 설정된다..env.local: local-test 환경에서 필요한 설정값을 설정하되, 다른 환경에서 해당 값을 모두 대체할 것을 권장한다.node 소스 코드 테스트 본좌급인듯?
This is a node.js driver for mysql. await를 공식적으로 구현하지 않았다. 아마 mysql2라는 모듈이 이를 지원하는 듯한데, postgresql을 주로 사용하게 되면서 사용안하게 되었다.
뮤텍스 알고리즘을 구현한 라이브러리. 굳이 구현하지말고 이거 쓰자.
const mutexify = require('mutexify/promise')
const fooLock = mutexify()
function foo() {
const fooRelease = await fooLock() // lock을하고 release함수를 리턴하는 듯
// main logic
fooRelease()
}
테스트 시 모의 HTTP 응답을 만듬. 실제 HTTP 엔드 포인트를 두지 않고 유닛 테스트를 할 수 있게 해줌.
ts에서 AOP(Aspect Oriented Programming) 구현한 라이브러리
import {Advice, Aspect} from 'ts-aspect'
import {AspectContext} from 'ts-aspect/build/aspect.interface'
import {UseAspect} from 'ts-aspect/build/decorator/UseAspect'
class LogAspect implements Aspect {
execute(ctx: AspectContext): void {
if (ctx.error) {
console.error(ctx.error)
}
console.log(ctx)
return ctx.returnValue
}
}
class Calculator {
@UseAspect(Advice.AfterReturn, LogAspect)
public add(a: number, b: number): number {
return a + b
}
@UseAspect(Advice.AfterReturn, LogAspect)
public divide(a: number, b: number): number {
if (b === 0) {
throw new Error('Division by zero!')
}
return a / b
}
}
const calculator = new Calculator()
const addResult = calculator.add(130, 37)
const divideResult = calculator.divide(1, 0)
{
target: Calculator {},
methodName: 'add',
functionParams: [ 130, 37 ],
returnValue: 167,
error: null
}
d:\_\aspect.ts:29
throw new Error('Division by zero!')
^
Error: Division by zero!
TypeScript-first schema validation with static type inference
ts판 joi라고 보면 될 듯
// all properties are required by default
const Dog = z.object({
name: z.string(),
age: z.number(),
});
// extract the inferred type like this
type Dog = z.infer<typeof Dog>;
// equivalent to:
type Dog = {
name: string;
age: number;
};