외부 훅
n8n v2.25외부 훅을 사용하면 n8n이 특정 작업을 수행할 때마다 커스텀 코드를 실행할 수 있습니다. 훅 등록에 사용하는 환경 변수에 대한 내용은 외부 훅 환경 변수를 참고하세요. 훅 함수가 담긴 훅 파일을 등록하여 훅을 설정합니다.
외부 훅을 사용하면 n8n이 특정 작업을 수행할 때마다 커스텀 코드를 실행할 수 있습니다. 데이터를 로깅하거나, 데이터를 변경하거나, 오류를 발생시켜 특정 동작을 금지하는 데 활용할 수 있습니다.
훅의 유형은 두 가지입니다:
- 백엔드 훅: 서버 측에서 실행되며,
EXTERNAL_HOOK_FILES환경 변수를 사용하여 등록합니다. - 프론트엔드 훅: 브라우저에서 실행되며, script 태그로 로드됩니다.
훅 등록에 사용하는 환경 변수에 대한 내용은 외부 훅 환경 변수를 참고하세요.
백엔드 훅#
사용 가능한 훅#
| 훅 | 인수 | 설명 |
|---|---|---|
credentials.create |
[credentialData: ICredentialsDb] |
새 자격 증명이 생성되기 전에 호출됩니다. 자격 증명 수를 제한하는 데 사용합니다. |
credentials.delete |
[id: credentialId] |
자격 증명이 삭제되기 전에 호출됩니다. |
credentials.update |
[credentialData: ICredentialsDb] |
n8n이 기존 자격 증명을 저장하기 전에 호출됩니다. |
frontend.settings |
[frontendSettings: IN8nUISettings] |
n8n 시작 시 호출됩니다. 예를 들어, 표시되는 OAuth URL 등 프론트엔드 데이터를 덮어쓸 수 있습니다. |
n8n.ready |
[app: App] |
n8n이 준비되면 호출됩니다. 예를 들어, 커스텀 API 엔드포인트를 등록하는 데 사용합니다. |
n8n.stop |
n8n 프로세스가 중지될 때 호출됩니다. 프로세스 데이터를 저장할 수 있습니다. | |
oauth1.authenticate |
[oAuthOptions: clientOAuth1.Options, oauthRequestData: {oauth_callback: string}] |
OAuth1 인증 전에 호출됩니다. OAuth 콜백 URL을 덮어쓰는 데 사용합니다. |
oauth2.callback |
[oAuth2Parameters: {clientId: string, clientSecret: string | undefined, accessTokenUri: string, authorizationUri: string, redirectUri: string, scopes: string[]}] |
OAuth2 콜백 시 호출됩니다. OAuth 콜백 URL을 덮어쓰는 데 사용합니다. |
workflow.activate |
[workflowData: IWorkflowDb] |
워크플로가 활성화되기 전에 호출됩니다. 활성 워크플로 수를 제한하는 데 사용합니다. |
workflow.afterCreate |
[workflowId: string] |
워크플로가 생성된 후 호출됩니다. |
workflow.afterDelete |
[workflowId: string] |
워크플로가 삭제된 후 호출됩니다. |
workflow.afterUpdate |
[workflowData: IWorkflowBase] |
기존 워크플로가 저장된 후 호출됩니다. |
workflow.create |
[workflowData: IWorkflowBase] |
워크플로가 생성되기 전에 호출됩니다. 저장된 워크플로 수를 제한하는 데 사용합니다. |
workflow.delete |
[workflowId: string] |
워크플로가 삭제되기 전에 호출됩니다. |
workflow.postExecute |
[run: IRun, workflowData: IWorkflowBase] |
워크플로가 실행된 후 호출됩니다. |
workflow.preExecute |
[workflow: Workflow, mode: WorkflowExecuteMode, workflowContext: WorkflowHookContextService] |
워크플로가 실행되기 전에 호출됩니다. 워크플로 실행 횟수를 집계하거나 제한할 수 있습니다. workflowContext 인수를 사용하는 예제는 훅 예제를 참고하세요(버전 2.23.0부터 사용 가능). |
workflow.update |
[workflowData: IWorkflowBase] |
기존 워크플로가 저장되기 전에 호출됩니다. |
workflow.afterArchive |
[workflowId: string] |
워크플로를 아카이브한 후 호출됩니다. |
workflow.afterUnarchive |
[workflowId: string] |
아카이브에서 워크플로를 복원한 후 호출됩니다. |
훅 등록#
훅 함수가 담긴 훅 파일을 등록하여 훅을 설정합니다. 훅을 등록하려면 환경 변수 EXTERNAL_HOOK_FILES를 설정하세요.
단일 파일로 변수를 설정할 수 있습니다:
EXTERNAL_HOOK_FILES=/data/hook.js
또는 콜론으로 구분하여 여러 파일을 포함할 수 있습니다:
EXTERNAL_HOOK_FILES=/data/hook1.js:/data/hook2.js
훅 파일#
훅 파일은 다음 형식의 일반 JavaScript 파일입니다:
module.exports = {
"frontend": {
"settings": [
async function (settings) {
settings.oauthCallbackUrls.oauth1 = 'https://n8n.example.com/oauth1/callback';
settings.oauthCallbackUrls.oauth2 = 'https://n8n.example.com/oauth2/callback';
}
]
},
"workflow": {
"activate": [
async function (workflowData) {
const activeWorkflows = await this.dbCollections.Workflow.count({ active: true });
if (activeWorkflows > 1) {
throw new Error(
'Active workflow limit reached.'
);
}
}
]
}
}
훅 예제#
필수 태그가 없을 경우 워크플로 실행 차단#
참고: workflowContext 인수는 n8n 버전 2.23.0부터 workflow.preExecute 훅에만 제공됩니다.
워크플로에 필수 태그가 없을 때 실행을 중단하려면 workflow.preExecute를 사용하세요:
module.exports = {
workflow: {
preExecute: [
async function (workflow, mode, workflowContext) {
const requiredTag = 'exampleTag';
const workflowTags = await workflowContext.getWorkflowTags(workflow.id);
if (!workflowTags.includes(requiredTag)) {
throw new Error(`Workflow is missing required tag "${requiredTag}", aborting`);
}
},
],
},
};
훅 함수#
하나의 훅 또는 훅 파일에는 여러 훅 함수를 포함할 수 있으며, 모든 함수는 순서대로 실행됩니다.
훅 함수의 매개변수가 객체인 경우, 해당 매개변수의 데이터를 변경하여 n8n의 동작을 변경할 수 있습니다.
또한 this.dbCollections를 사용하여 모든 훅 함수에서 데이터베이스(DB)에 접근할 수 있습니다(위의 훅 파일 코드 샘플 참고).
프론트엔드 외부 훅#
백엔드 외부 훅과 마찬가지로, 사용자가 특정 작업을 수행할 때마다 n8n이 실행하는 외부 훅을 프론트엔드 코드에서도 정의할 수 있습니다. 예를 들어, 데이터를 로깅하거나 변경하는 데 활용할 수 있습니다.
사용 가능한 훅#
| 훅 | 설명 |
|---|---|
credentialsEdit.credentialTypeChanged |
기존 자격 증명의 유형이 변경될 때 호출됩니다. |
credentials.create |
누군가 새 자격 증명을 생성할 때 호출됩니다. |
credentialsList.dialogVisibleChanged |
|
dataDisplay.nodeTypeChanged |
|
dataDisplay.onDocumentationUrlClick |
누군가 도움말 문서 링크를 선택할 때 호출됩니다. |
execution.open |
기존 실행이 열릴 때 호출됩니다. |
executionsList.openDialog |
누군가 기존 워크플로 실행 목록에서 실행을 선택할 때 호출됩니다. |
expressionEdit.itemSelected |
|
expressionEdit.dialogVisibleChanged |
|
nodeCreateList.filteredNodeTypesComputed |
|
nodeCreateList.nodeFilterChanged |
누군가 노드 패널 필터를 변경할 때 호출됩니다. |
nodeCreateList.selectedTypeChanged |
|
nodeCreateList.mounted |
|
nodeCreateList.destroyed |
|
nodeSettings.credentialSelected |
|
nodeSettings.valueChanged |
|
nodeView.createNodeActiveChanged |
|
nodeView.addNodeButton |
|
nodeView.mount |
|
pushConnection.executionFinished |
|
showMessage.showError |
|
runData.displayModeChanged |
|
workflow.activeChange |
|
workflow.activeChangeCurrent |
|
workflow.afterUpdate |
누군가 기존 워크플로를 업데이트할 때 호출됩니다. |
workflow.open |
|
workflowRun.runError |
|
workflowRun.runWorkflow |
워크플로가 실행될 때 호출됩니다. |
workflowSettings.dialogVisibleChanged |
|
workflowSettings.saveSettings |
누군가 워크플로의 설정을 저장할 때 호출됩니다. |
프론트엔드 훅 등록#
페이지에 훅 스크립트를 로드하여 훅을 설정할 수 있습니다. 이를 위한 한 가지 방법은 프로젝트에 훅 파일을 만들고 editor-ui/public/index.html 파일에 script 태그를 추가하는 것입니다:
<script src="frontend-hooks.js"></script>
프론트엔드 훅 파일#
프론트엔드 외부 훅 파일은 다음 형식의 일반 JavaScript 파일입니다:
window.n8nExternalHooks = {
nodeView: {
mount: [
function (store, meta) {
// do something
},
],
createNodeActiveChanged: [
function (store, meta) {
// do something
},
function (store, meta) {
// do something else
},
],
addNodeButton: [
function (store, meta) {
// do something
},
],
},
};
프론트엔드 훅 함수#
훅당 여러 훅 함수를 정의할 수 있습니다. n8n은 각 훅 함수를 다음 인수와 함께 호출합니다:
store: Vuex 스토어 객체입니다. 스토어에서 데이터를 변경하거나 가져오는 데 사용할 수 있습니다.metadata: 훅에서 제공하는 데이터를 담는 객체입니다. 전달되는 내용을 확인하려면editor-ui패키지에서 해당 훅을 검색하세요.