Как разрешить локальные переменные env в Serverless Framework V4?

Недавно я запустил проект с использованием Serverless V4, но не могу получить переменные из своего .env. В качестве плагина я использую serverless-offline, Node.js v21.7.1.

Это мой serverless.yml

# "org" ensures this Service is used with the correct Serverless Framework Access Key.
org: kennethlg
# "app" enables Serverless Framework Dashboard features and sharing them with other Services.
app: hoost
# "service" is the name of this project. This will also be added to your AWS resource names.
service: my-project

provider:
  name: aws
  runtime: nodejs20.x
functions:
  getListings:
    handler: src/controllers/getListings/index.handler
    events:
      - httpApi:
          path: /listings
          method: get
  login:
    handler: src/controllers/login/index.handler
    events:
      - httpApi:
          path: /login
          method: get
plugins:
  - serverless-offline
const responseHandler = require("../../libs/response");
const { login } = require("../../services/hostaway");

module.exports.handler = async () => {
  try {
    const data = await login();
    return responseHandler.success(data, 'Login successful');
  } catch (error) {
    return responseHandler.error('Couldn\'t login sucessfully');
  }
} 
const { instance } = require('../libs/axios');
const config = require('../config');

const login = async () => {
  try {
    console.info(config)
    const data = new URLSearchParams();
    data.append('grant_type', 'client_credentials');
    data.append('client_id', config.hostawayId);
    data.append('client_secret', config.hostawayApiKey);
    data.append('scope', 'general');

    const response = await instance.post('/accessTokens', data, {
      headers: {
        'Content-Type': 'application/x-www-form-urlencoded',
        'Cache-Control': 'no-cache',
      }
    });
    return response.data;
  } catch (error) {
    console.info("🚀 ~ login ~ error:", error);
    throw new Error('Error authenticating to Hostaway');
  }
}

Я получаю ошибку 500, потому что мои переменные окружения установлены неправильно:

const config = {
  port: process.env.PORT || 3000,
  hostawayApiKey: process.env.HOSTAWAY_API_KEY,
  hostawayId: parseInt(process.env.HOSTAWAY_ID)
}

module.exports = config;
Server ready: http://localhost:3000 🚀


GET /login (λ: login)
{ port: 3000, hostawayApiKey: undefined, hostawayId: NaN }

Я прочитал документацию, и там сказано, что бессерверная версия 4 уже настроена на использование локальных сред, но, как я упоминал ранее, она не работает. Это документация: https://www.serverless.com/framework/docs-providers-aws-guide-variables

Вам необходимо настроить env в объекте environment в конфигурации функции.

Yuvaraj M 01.06.2024 10:20
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
110
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Файл .env не будет прочитан автоматически — вам нужно сделать это самостоятельно, например, с помощью пакета dotenv:

require('dotenv').config()

В этой документации (обновление с версии 3 до версии 4) говорится: «Переменные среды, загружаемые по умолчанию. В предыдущих версиях Serverless Framework (<= V.3) для загрузки .env необходимо было установить конфигурацию useDotEnv в serverless.yml. и [stage].env и сделать их переменные среды доступными в serverless.yml. В версии V.4 эти файлы читаются автоматически, без свойства useDotEnv. serverless.com/framework/docs/guides/upgrading-v4 Как вы думаете, мне еще нужно установить dotenv?

Orson Leiziaga 31.05.2024 19:08
Ответ принят как подходящий

В предыдущих версиях Serverless Framework (<= V.3) конфигурацию useDotEnv в serverless.yml нужно было установить, чтобы загружать файлы .env и [stage].env и делать их переменные среды доступными внутри serverless.yml.

В версии V.4 эти файлы считываются автоматически, без свойства useDotEnv. Это означает, что вы можете автоматически получить доступ к переменным .env внутри serverless.yml, а не в лямбда-среде.

Решение

Вам необходимо настроить переменные среды лямбда вручную в serverless.yml

  1. Если вы хотите изменить конфигурацию конкретной функции, добавив свойство объекта environment в конфигурацию функции. Этот объект должен содержать пары ключ-значение строки и строки, как показано ниже.

     functions:
       getListings:
         handler: src/controllers/getListings/index.handler
         environment:
           HOSTAWAY_API_KEY: ${env:HOSTAWAY_API_KEY}
           HOSTAWAY_ID: ${env:HOSTAWAY_ID}
         events:
           - httpApi:
               path: /listings
               method: get
    
  2. Или, если вы хотите применить конфигурацию переменной среды ко всем функциям вашего сервиса, вы можете добавить конфигурацию к объекту более высокого уровня provider.

     provider:
       name: aws
       runtime: nodejs20.x
       environment:
             HOSTAWAY_API_KEY: ${env:HOSTAWAY_API_KEY}
             HOSTAWAY_ID: ${env:HOSTAWAY_ID}
    

Другие вопросы по теме