Node.js 액션 사용하기

액션 생성하기

먼저 아래와 같이 이름과 장소를 포함한, "Hello World"를 출력하는 간단한 JavaScript 코드인 hello.js를 작성합니다.

function main(params) {
    var name = params.name || 'World';
    var place = params.place || 'Naver';
    return {payload:  'Hello, ' + name + ' in ' + place + '!'};
}

JavaScript 코드는 여러 개의 함수를 포함할 수 있지만 Main 함수는 프로그램의 시작점으로써 반드시 선언되어야 합니다.

위에서 작성한 코드로 'hello'라는 이름의 액션을 생성합니다.

액션을 NodeJS 모듈로 패키징하기

코드를 작성하다 보면 하나 이상의 파일을 만들어야 하거나, 기본적으로 제공되는 라이브러리 외에 별도의 라이브러리를 사용해야 하는 경우가 있습니다. 이런 경우, 관련된 파일들을 하나의 모듈로 패키징하고, 패키징된 파일을 이용하여 액션을 생성할 수 있습니다.

아래와 같이 간단한 package.json 파일을 작성합니다.

{
  "name": "my-action",
  "main": "index.js",
  "dependencies" : {
    "left-pad" : "1.1.3"
  }
}

그리고 'left-pad'를 이용하는 간단한 'index.js' 파일을 작성합니다.

function myAction(args) {
    const leftPad = require("left-pad")
    const lines = args.lines || [];
    return { padded: lines.map(l => leftPad(l, 30, ".")) }
}
exports.main = myAction;

npm install 명령으로 'left-pad' 라이브러리를 설치하고, ZIP 파일을 생성합니다.

$ npm install
$ zip -r action.zip *

ZIP 파일을 생성할 때 'package.json' 파일은 반드시 ZIP 파일의 루트(root)에 위치해야 합니다.

아래와 같이 생성된 ZIP 파일로 액션(Action)을 생성합니다.

compute-15-2-102

액션의 실행은 기존과 동일한 방법으로 실행할 수 있습니다.

현재, npm install 실행 시 설치된 Dependency 중에 바이너리 파일이 포함된 경우에는 액션이 정상적으로 실행되지 않습니다.

비동기(Asynchronous) 액션 생성하기

주의: 아래와 같이 실행할 경우 리소스를 독점하여 지나친 과금의 원인이 될 수 있습니다.

비동기(Asynchronous)적으로 동작하는 JavaScript 함수의 경우, main 함수가 종료된 이후에 Activation 결과값을 반환해야 하는 경우가 있습니다. 이럴 때는 액션 내에서 Promise를 반환함으로써 해결할 수 있습니다.

다음과 같이 asynchAction을 생성합니다.

function main(args) {
     return new Promise(function(resolve, reject) {
       setTimeout(function() {
         resolve({ done: true });
       }, 2000);
    })
 }

위 예는 main 함수에서 Promise를 반환하고 있습니다. 이는 액션의 실행이 아직 완료되지 않았고 미래에 완료될 것임을 나타냅니다.

setTimeout 함수에 의해 2초 후에 Callback이 실행됩니다. Callback 내의 resolve() 함수가 실행되는 시점에 Promise가 만족되며 액션 실행이 정상적으로 완료됩니다. 만약 reject() 함수를 호출하는 경우, 액션이 비정상적으로 완료되었음을 나타낼 수 있습니다.

다음은 asyncAction을 생성하는 화면입니다.

compute-15-2-103

asyncAction을 실행하면 약 2초 후에 결과가 반환됨을 알 수 있습니다. 해당 Activation 정보를 확인해보면 startend간의 Timestamp가 약 2초 정도 차이가 나는 것을 확인할 수 있습니다.

compute-15-2-103

기본 파라미터 설정하기

매번 액션을 실행할 때마다 파라미터를 전달하는 대신, 특정 파라미터에 기본값을 지정할 수 있습니다. 위에서 생성한 hello 액션의 place 파라미터에 기본값을 등록해 보겠습니다.

compute-15-2-105

액션 실행 시 파라미터 전달하기

액션 실행 시 입력으로 파라미터를 전달할 수 있습니다. Main 함수에 전달되는 파라미터는 JSON object 형식으로 전달됩니다.

파라미터는 액션 실행 시 직접 입력하거나, JSON 형식의 파일을 작성하여 전달할 수 있습니다. 파일을 통해 파라미터를 전달하는 경우에는 아래와 같은 JSON 형식의 파일을 작성해야 합니다.

compute-15-2-106

액션 런타임 정보

각 액션 컨테이너에는 기본 라이브러리들이 내장되어 있으며, 이 라이브러리들은 별도의 추가 작업 없이 임포트하여 사용하실 수 있습니다.

NodeJS 6 라이브러리

NodeJS 6.12.2 버전이 제공되며, 액션 생성 시 명시적으로 Node.js 6 액션 컨테이너를 생성할 수 있습니다.

NodeJS 6 액션 컨테이너는 기본적으로 아래의 라이브러리를 포함하고 있습니다.

아래에 나열된 라이브러리들은 별도의 추가 작업 없이, 다음 예제 코드와 같이 require 구문을 통해 액션 코드 내에서 사용하실 수 있습니다.

var rp = require('request-promise')

function main(params) {
    return rp('https://www.naver.com')
        .then(function (htmlString) {
            console.log("yes");
            return { status: 'ok' };
        })
        .catch(function(err) {
            console.log("no");
            return { status: 'error' };
        });
}
  • apn v2.1.2 - A Node.js module for interfacing with the Apple Push Notification service.
  • async v2.1.4 - Provides functions for working with asynchronous functions.
  • btoa v1.1.2 - A port of the browser's btoa function.
  • cheerio v0.22.0 - Fast, flexible & lean implementation of core jQuery designed specifically for the server.
  • cloudant v1.6.2 - This is the official Cloudant library for Node.js.
  • commander v2.9.0 - The complete solution for Node.js command-line interfaces.
  • consul v0.27.0 - A client for Consul, involving service discovery and configuration.
  • cookie-parser v1.4.3 - Parse Cookie header and populate req.cookies with an object keyed by the cookie names.
  • cradle v0.7.1 - A high-level, caching, CouchDB client for Node.js.
  • errorhandler v1.5.0 - Development-only error handler middleware.
  • glob v7.1.1 - Match files by using patterns that the shell uses, like stars and stuff.
  • gm v1.23.0 - GraphicsMagick and ImageMagick for Node.
  • lodash v4.17.2 - The Lodash library exported as Node.js modules.
  • log4js v0.6.38 - A conversion of the log4js framework designed to work with Node.
  • iconv-lite v0.4.15 - Pure JS character encoding conversion
  • marked v0.3.6 - A full-featured markdown parser and compiler, which is written in JavaScript. Built for speed.
  • merge v1.2.0 - Merge multiple objects into one, optionally creating a new cloned object.
  • moment v2.17.0 - A lightweight JavaScript date library for parsing, validating, manipulating, and formatting dates.
  • mongodb v2.2.11 - The official MongoDB driver for Node.js.
  • mustache v2.3.0 - Mustache.js is an implementation of the mustache template system in JavaScript.
  • nano v6.2.0 - Minimalistic couchdb driver for Node.js.
  • node-uuid v1.4.7 - Deprecated UUID packaged.
  • nodemailer v2.6.4 - Send e-mails from Node.js – easy as cake!
  • oauth2-server v2.4.1 - Complete, compliant, and well tested module for implementing an OAuth2 Server/Provider with express in Node.js.
  • openwhisk v3.11.0 - JavaScript client library for the OpenWhisk platform. Provides a wrapper around the OpenWhisk APIs.
  • pkgcloud v1.4.0 - pkgcloud is a standard library for Node.js that abstracts away differences among multiple cloud providers.
  • process v0.11.9 - Require('process'); just like any other module.
  • pug v2.0.0-beta6 - Implements the Pug templating language.
  • redis v2.6.3 - This is a complete and feature-rich Redis client for Node.js.
  • request v2.79.0 - Request is the simplest way possible to make HTTP calls.
  • request-promise v4.1.1 - The simplified HTTP request client 'request' with Promise support. Powered by Bluebird.
  • rimraf v2.5.4 - The UNIX command rm -rf for node.
  • semver v5.3.0 - Supports semantic versioning.
  • sendgrid v4.7.1 - Provides email support via the SendGrid API.
  • serve-favicon v2.3.2 - Node.js middleware for serving a favicon.
  • socket.io v1.6.0 - Socket.IO enables real-time bidirectional event-based communication.
  • socket.io-client v1.6.0 - Client-side support for Socket.IO.
  • superagent v3.0.0 - SuperAgent is a small progressive client-side HTTP request library, and Node.js module with the same API, sporting many high-level HTTP client features.
  • swagger-tools v0.10.1 - Tools that are related to working with Swagger, a way to document APIs.
  • tmp v0.0.31 - A simple temporary file and directory creator for node.js.
  • twilio v2.11.1 - A wrapper for the Twilio API, related to voice, video, and messaging.
  • underscore v1.8.3 - Underscore.js is a utility-belt library for JavaScript that supports the usual functional suspects (each, map, reduce, filter...) without extending any core JavaScript objects.
  • uuid v3.0.0 - Simple, fast generation of RFC4122 UUIDS.
  • validator v6.1.0 - A library of string validators and sanitizers.
  • watson-developer-cloud v2.29.0 - Node.js client library to use the Watson Developer Cloud services, a collection of APIs that use cognitive computing to solve complex problems.
  • when v3.7.7 - When.js is a rock solid, battle-tested Promises/A+ and when() implementation, including a complete ES6 Promise shim.
  • winston v2.3.0 - A multi-transport async logging library for node.js. "CHILL WINSTON! ... I put it in the logs."
  • ws v1.1.1 - ws is a simple to use, blazing fast, and thoroughly tested WebSocket client and server implementation.
  • xml2js v0.4.17 - Simple XML to JavaScript object converter. It supports bi-directional conversion.
  • xmlhttprequest v1.8.0 - node-XMLHttpRequest is a wrapper for the built-in http client to emulate the browser XMLHttpRequest object.
  • yauzl v2.7.0 - Yet another unzip library for node. For zipping.

NodeJS 8 라이브러리

  • openwhisk v3.11.0 - JavaScript client library for the OpenWhisk platform. Provides a wrapper around the OpenWhisk APIs.
  • request v2.79.0 - Request is the simplest way possible to make HTTP calls.
  • request-promise v4.1.1 - The simplified HTTP request client 'request' with Promise support. Powered by Bluebird.

연관 정보 바로가기

아래 가이드에서 연관 정보를 확인할 수 있습니다.

""에 대한 건이 검색되었습니다.

    ""에 대한 검색 결과가 없습니다.

    처리중...