[Yandex Cloud documentation](../../../index.md) > [Yandex Cloud Functions](../../index.md) > [Getting started](../index.md) > [Creating a function](index.md) > Node.js

# Creating a function in Node.js

Create and run a user welcome [function](../../concepts/function.md) in Node.js.

## Getting started {#before-begin}

[Create a folder](../../../resource-manager/operations/folder/create.md) in Yandex Cloud.

## Create a function {#create-func}

{% list tabs group=instructions %}

- Management console {#console}

    1. In the [management console](https://console.yandex.cloud), select the folder where you want to create a function.
    1. Navigate to **Cloud Functions**.
    1. Click **Create function**.
    1. Enter the function name: `nodejs-function`.
    1. Click **Create**.

- CLI {#cli}

    If you do not have the Yandex Cloud CLI yet, [install and initialize it](../../../cli/quickstart.md#install).

    The folder used by default is the one specified when [creating](../../../cli/operations/profile/profile-create.md) the CLI profile. To change the default folder, use the `yc config set folder-id <folder_ID>` command. You can also specify a different folder for any command using `--folder-name` or `--folder-id`. If you access a resource by its name, the search will be limited to the default folder. If you access a resource by its ID, the search will be global, i.e., through all folders based on access permissions.

    To create a function, run this command:

    ```
    yc serverless function create --name=nodejs-function
    ```

    Result:

    ```
    id: b09bhaokchn9********
    folder_id: aoek49ghmknn********
    created_at: "2023-08-16T19:01:37.475Z"
    name: nodejs-function
    log_group_id: eolm8aoq9vcp********
    http_invoke_url: https://functions.yandexcloud.net/b09bhaokchn9********
    status: ACTIVE
    ```

- API {#api}

    You can create a function using the [create](../../functions/api-ref/Function/create.md) API method.


{% endlist %}

## Create the first version of your function {#create-first-version}

To create a function [version](../../concepts/function.md#version), you can use one of the [code upload formats](../../concepts/function.md#upload). This example uses a ZIP archive.

{% note warning %}

Use Object Storage to [upload](../../../storage/operations/objects/upload.md) files larger than 3.5 MB. For more information about limits, see [Quotas and limits in Cloud Functions](../../concepts/limits.md).

{% endnote %}

### Prepare a ZIP archive with the function code {#create-js-zip}

1. Save the following code to a file named `hello.js`:
    ```js
    exports.handler = async function (event, context) {
        name = event.queryStringParameters.name
        return {
            'statusCode': 200,
            'headers': {
                'Content-Type': 'text/plain'
            },
            'isBase64Encoded': false,
            'body': `Hello, ${name}!`
        }
    };
    ```

1. Add `hello.js` to the `hello-js.zip` archive.

### Create a function version {#create-version}

{% list tabs group=instructions %}

- Management console {#console}

    1. In the [management console](https://console.yandex.cloud), navigate to the folder containing the function.
    1. Navigate to **Cloud Functions**.
    1. Select the `nodejs-function` function.
    1. Under **Last version**, click **Сreate in editor**.
    1. Select the `Node.js 18` runtime.
    1. Disable **Add files with code examples** and click **Continue**.
        1. Configure the version:
        * **Code source**: `ZIP archive`.
        * **File**: Attach `hello-js.zip`.
        * **Entry point**: `hello.handler`.
        * **Timeout**: `3`.
        * **Memory**: `128 MB`.
        * **Service account**: `Not selected`.
    1. Click **Save changes**.

- CLI {#cli}

    If you do not have the Yandex Cloud CLI yet, [install and initialize it](../../../cli/quickstart.md#install).

    The folder used by default is the one specified when [creating](../../../cli/operations/profile/profile-create.md) the CLI profile. To change the default folder, use the `yc config set folder-id <folder_ID>` command. You can also specify a different folder for any command using `--folder-name` or `--folder-id`. If you access a resource by its name, the search will be limited to the default folder. If you access a resource by its ID, the search will be global, i.e., through all folders based on access permissions.

    To create a function version, run this command:
  
    ```
    yc serverless function version create \
      --function-name=nodejs-function \
      --runtime nodejs18 \
      --entrypoint hello.handler \
      --memory 128m \
      --execution-timeout 3s \
      --source-path ./hello-js.zip
    ```

    Where:

    * `--function-name`: Name of the function whose version you want to create.
    * `--runtime`: Runtime.
    * `--entrypoint`: Entry point in `<function_file_name>.<handler_name>` format.
    * `--memory`: Amount of RAM.
    * `--execution-timeout`: Maximum function execution time before timeout.
    * `--source-path`: ZIP archive with the function code and required dependencies.

    Result:

    ```
    done (1s)
    id: d4evvn8obisa********
    function_id: d4elpv8pft63********
    created_at: "2023-08-16T19:09:19.531Z"
    runtime: nodejs18
    entrypoint: hello.handler
    resources:
        memory: "134217728"
    execution_timeout: 3s
    image_size: "4096"
    status: ACTIVE
    tags:
    - $latest
    log_group_id: ckg3qh8h363p********
    ```

- API {#api}

    You can create a function version using the [createVersion](../../functions/api-ref/Function/createVersion.md) API method.


{% endlist %}

## Invoke the function {#invoke}

{% note info %}

To allow any user to invoke your function, [make it public](../../operations/function/function-public.md). For more information about access permissions, see [Access management in Cloud Functions](../../security/index.md).

{% endnote %}

{% list tabs group=instructions %}

- Management console {#console}

    1. In the [management console](https://console.yandex.cloud), navigate to the folder containing the function.
    1. Navigate to **Cloud Functions**.
    1. Select the function.
    1. Navigate to the ![CirclePlay](../../../_assets/console-icons/circle-play.svg) **Testing** tab.
    1. In the **Version tag** field, specify `$latest` to invoke the latest function version.
    1. In the **Payload template** field, select `No template`.
    1. In the **Payload** field, enter:
       ```
       {"queryStringParameters": {"name": "Username"}}
       ```
    1. Click ![PlayFill](../../../_assets/console-icons/play-fill.svg) **Run test**.
    1. You will see the test status under **Test result** in the **Function status** field. **Note** that the maximum function execution time before [timeout](../../operations/function/version-manage.md), including first call initialization, is ten minutes.
    1. You will see the function execution result in the **Function output** field:
       ```
       {
         "statusCode": 200,
         "headers": {
           "Content-Type": "text/plain"
         },
         "isBase64Encoded": false,
         "body": "Hello, Username!"
       }
       ```

- CLI {#cli}

    If you do not have the Yandex Cloud CLI yet, [install and initialize it](../../../cli/quickstart.md#install).

    The folder used by default is the one specified when [creating](../../../cli/operations/profile/profile-create.md) the CLI profile. To change the default folder, use the `yc config set folder-id <folder_ID>` command. You can also specify a different folder for any command using `--folder-name` or `--folder-id`. If you access a resource by its name, the search will be limited to the default folder. If you access a resource by its ID, the search will be global, i.e., through all folders based on access permissions.

    To invoke a function, run this command:

    ```
    yc serverless function invoke <function_ID> -d '{"queryStringParameters": {"name": "Username"}}'
    ```

    Result:

    ```
    {"statusCode":200,"headers":{"Content-Type":"text/plain"},"isBase64Encoded":false,"body":"Hello, Username!"}
    ```

    The function version with the `$latest` tag is invoked by default.

- HTTPS {#https}

	You can find the function invocation link on the **Overview** tab, in the **Link to invoke** field.

	For security reasons, you can only invoke a function via HTTPS. Invoke it as a regular HTTP request by pasting the link into the browser address bar and adding the `name` parameter to the URL:

	```
	https://functions.yandexcloud.net/<function_ID>?name=Username
	```

	The following response will appear on the page:

	```
	Hello, Username!
	```


{% endlist %}

## What's next {#what-is-next}

- To learn more about the function structure required for different invocation methods (HTTP and CLI), see [Invoking a function in Cloud Functions](../../concepts/function-invoke.md).
- Read about [service concepts](../../concepts/index.md).
- Check out our [step-by-step guides](../../operations/index.md) to learn what you can do with functions and their versions.