문서 메뉴
문서 홈
/ /
Atlas App Services

Atlas Functions

이 페이지의 내용

  • 개요
  • 함수 작성 방법
  • 사용자 및 시스템 함수
  • 함수 정의하기
  • 함수 호출
  • 제약 조건

Atlas Function은 앱의 동작을 정의하기 위해 작성하는 서버 측 자바스크립트 코드입니다. 클라이언트 앱에서 직접 앱 함수를 호출하거나 함수를 자동으로 통합하고 호출하는 서비스를 정의할 수 있습니다.

함수는 다른 함수를 호출할 수 있으며, MongoDB Atlas 클러스터에서 데이터를 작업을 위한 내장 클라이언트를 포함합니다. 또한 유용한 글로벌 유틸리티가 포함되어 있고, 일반적인 Node.js 내장 모듈을 지원하며, npm 레지스트리에서 외부 패키지를 가져와서 사용할 수 있습니다.

인사말을 반환하는 기본 함수
exports = function(name) {
return `Hello, ${name ?? "stranger"}!`
}

함수가 호출되면, 사용자 앱은 관리되는 앱 서버로 요청을 라우팅하여 사용자의 코드를 평가하고 결과를 반환합니다. 이 모델은 함수를 서버리스로 만들며, 이는 코드를 실행하기 위해 서버를 배포하고 관리할 필요가 없음을 의미합니다. 대신 함수 소스 코드를 작성하면 앱이 실행 환경을 처리합니다.

함수는 실행 환경을 반영하는 컨텍스트에서 실행됩니다. 컨텍스트에는 함수를 호출한 사용자, 함수를 호출한 방법, 함수를 호출한 시점의 앱 상태가 포함됩니다. 컨텍스트를 사용하여 사용자별 코드를 실행하고 앱의 다른 부분과 함께 작업할 수 있습니다.

함수 컨텍스트로 작업하는 방법에 대해 자세히 알아보려면 컨텍스트를 참조하세요.

함수는 사용자가 정의한 임의의 JavaScript 코드를 실행할 수 있습니다. 즉, 거의 모든 용도에 사용할 수 있음을 의미합니다. 일반적인 사용 사례에는 데이터 이동, 변환, 검증과 같이 지연 시간이 짧고 실행 시간이 짧은 작업 등이 있습니다. 또한 이를 사용하여 외부 서비스에 연결하고 클라이언트 애플리케이션에서 구현 세부 정보를 추상화할 수 있습니다.

직접 호출하는 함수 외에도 HTTPS endpoints, Atlas Triggers, GraphQL 사용자 지정 해석기(GraphQL은 더 이상 사용되지 않음, 자세히 알아보기)와 같은 다양한 서비스에 대한 함수를 작성할 수도 있습니다. 이러한 서비스는 특정 이벤트를 처리하기 위해 함수를 자동으로 호출합니다. 예를 들어, 데이터베이스 trigger는 변경 이벤트를 관찰할 때마다 변경 이벤트를 인수로 사용하여 관련 함수를 호출합니다. trigger 함수에서 변경 이벤트의 정보에 액세스하고 적절하게 응답할 수 있습니다.

다음도 참조하세요.

함수의 코드는 기본적으로 명명된 JavaScript 소스 파일로, 하나의 함수 파일에 여러 JavaScript 함수를 정의할 수 있습니다. 파일은 수신 호출의 진입점 역할을 하기 위해 단일 JavaScript 함수를 내보내야 합니다. 이름으로 함수를 호출하면 실제로 함수의 소스 파일에서 exports에 할당된 JavaScript 함수를 호출하게 됩니다.

예를 들어, 다음은 name 인수를 받아들이고, 로그 메시지를 추가하고, 제공된 이름에 대한 인사말을 반환하는 간단한 함수입니다.

exports = function Hello(name) {
console.log(`Said hello to ${name}`);
return `Hello, ${name}!`;
};

더 복잡한 기능을 정의하기 위해 최신 JavaScript 구문을 사용하고 패키지를 가져올 수 있습니다.

// You can use ES6 arrow functions
const uppercase = (str) => {
return str.toUpperCase();
};
// You can use async functions and await Promises
exports = async function GetWeather() {
// You can get information about the user called the function
const city = context.user.custom_data.city;
// You can import Node.js built-ins and npm packages
const { URL } = require("url");
const weatherUrl = new URL("https://example.com");
weatherUrl.pathname = "/weather";
weatherUrl.search = `?location="${city}"`;
// You can send HTTPS requests to external services
const weatherResponse = await context.http.get({
url: url.toString(),
headers: {
Accept: ["application/json"],
},
});
const { current, forecasts } = JSON.parse(weatherResponse.body.text());
return [
`Right now ${uppercase(city)} is ${current.temperature}°F and ${current.weather}.`,
`Here's the forecast for the next 7 days:`,
forecasts
.map((f) => `${f.day}: ${f.temperature}°F and ${f.weather}`)
.join("\n "),
].join("\n");
};
Right now NEW YORK CITY is 72°F and sunny.
Here's the forecast for the next 7 days:
Tuesday: 71°F and sunny
Wednesday: 72°F and sunny
Thursday: 73°F and partly cloudy
Friday: 71°F and rainy
Saturday: 77°F and sunny
Sunday: 76°F and sunny
Monday: 74°F and sunny

함수는 반환된 값을 확장 JSON 으로 자동 직렬화합니다. 이는 유형 정보를 보존하는 데 유용하지만 애플리케이션이 예상하는 것과 다를 수 있습니다.

예를 들어 다음 함수에서 반환된 객체의 값은 구조화된 EJSON 값으로 변환됩니다.

exports = function() {
return {
pi: 3.14159,
today: new Date(),
}
}
{
"pi": {
"$numberDouble": "3.14159"
},
"today": {
"$date": {
"$numberLong": "1652297239913"
}
}
}

값을 표준 JSON으로 반환하려면 값에 대해 JSON.stringify() 호출한 다음 문자열화된 결과를 반환합니다.

exports = function() {
return JSON.stringify({
pi: 3.14159,
today: new Date(),
})
}
"{\"pi\":3.14159,\"today\":\"2022-05-11T19:27:32.207Z\"}"

함수는 구성 및 호출 방식에 따라 다음과 같이 두 가지 컨텍스트에서 실행될 수 있습니다.

  • 사용자 함수는 애플리케이션의 특정 사용자 컨텍스트에서 실행됩니다. 일반적으로 함수를 호출한 로그인 사용자입니다. 사용자 함수에는 규칙스키마 유효성 검사가 적용됩니다.

  • 시스템 함수는 특정 애플리케이션 사용자가 아닌 시스템 사용자로 실행됩니다. 시스템 함수는 MongoDB CRUD 및 집계 API에 대한 전체 액세스 권한을 가지며 모든 규칙 및 스키마 유효성 검사를 우회합니다.

참고

동적 context.user 참조

context.user에 대한 참조는 해당 함수가 시스템 함수로 실행되더라도, 함수를 호출한 인증된 사용자가 있었다면 항상 그 사용자로 해결(resolve)합니다. 함수가 시스템 함수로 실행되고 있는지 확인하려면 context.runningAsSystem()를 호출하세요.

트리거 또는 웹훅과 같이 인증된 사용자가 호출하지 않고 함수가 실행되는 경우, 동적 참조는 id 또는 기타 관련 데이터가 없는 시스템 사용자로 해결(resolve)합니다.

App Services UI에서 또는 App Services CLI 또는 GitHub 배포를 통해 함수 구성 및 소스 코드를 가져와 사용자의 애플리케이션에서 함수를 생성하고 관리할 수 있습니다.

다른 함수, 연결된 클라이언트 애플리케이션 또는 App Services CLI를 사용하여 함수를 호출할 수 있습니다.

이 섹션의 예시에서는 인수 두 개를 받아 인수를 더하고 결과를 반환하는 sum이라는 간단한 함수를 호출하는 방법을 보여 줍니다.

// sum: adds two numbers
exports = function sum(a, b) {
return a + b;
};

모든 함수에서 글로벌 변수로 사용할 수 있는 context.functions 인터페이스를 통해 다른 함수에서 함수를 호출할 수 있습니다. 여기에는 HTTPS endpoints, Atlas Triggers 및 GraphQL 사용자 지정 해석기(사용 중단됨, 자세히 알아보기)가 포함됩니다. 호출된 함수는 이를 호출한 함수와 동일한 컨텍스트에서 실행됩니다.

// difference: subtracts b from a using the sum function
exports = function difference(a, b) {
return context.functions.execute("sum", a, -1 * b);
};

App Services CLI를 통해 function run 명령어를 사용하여 함수를 호출할 수 있습니다. 이 명령어는 함수 결과를 EJSON으로 반환할 뿐만 아니라, 모든 로그나 오류 메시지도 반환합니다.

appservices function run \
--function=sum \
--args=1 --args=2

기본적으로 함수는 시스템 컨텍스트 에서 실행됩니다. 특정 사용자의 컨텍스트에서 함수를 호출하려면 --user 인수에 해당 사용자 ID를 포함하세요.

appservices function run \
--function=sum \
--args=1 --args=2 \
--user=61a50d82532cbd0de95c7c89

%function 연산자를 사용하여 규칙 표현식에서 함수를 호출할 수 있습니다. 연산자는 함수의 반환 값으로 평가됩니다. 함수에서 오류가 발생하면 표현식이 false로 평가됩니다.

{
"numGamesPlayed": {
"%function": {
"name": "sum",
"arguments": [
"%%root.numWins",
"%%root.numLosses"
]
}
}
}

중요

Functions를 사용할 때 코드 삽입을 방지하기 위해 클라이언트 데이터를 삭제해야 합니다.

Realm SDK나 와이어 프로토콜을 통해 연결된 클라이언트 애플리케이션에서 함수를 호출할 수 있습니다. 클라이언트 애플리케이션에서 함수를 호출하는 방법을 보여주는 코드 예시는 Realm SDK 문서를 참조하세요.

  • 함수는 요청당 런타임이 300초로 제한되며, 이 시간이 지나면 함수가 타임아웃되어 실패합니다.

  • 함수는 언제든지 최대 350MB의 메모리를 사용할 수 있습니다.

  • 함수는 1000개의 비동기 작업으로 제한됩니다.

  • 함수는 가장 일반적으로 사용되는 ES6+ 기능과 Node.js 내장 모듈을 지원합니다. 하지만 일반적이지 않거나 서버리스 워크로드에 적합하지 않은 일부 기능은 지원되지 않습니다. 자세한 내용은 JavaScript 지원을 참조하세요.

  • 함수는 네트 를 25 사용하여 최대 개의 소켓을 열 수 있습니다. 내장 모듈.

  • 들어오는 요청의 최대 크기는 18MB로 제한됩니다. 이 제한은 함수에 전달된 모든 인수의 전체 크기뿐만 아니라, 함수가 HTTPS 엔드포인트를 통해 호출된 경우 요청 헤더 또는 페이로드에도 적용됩니다.

←