Недавно я запустил проект с использованием 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 не будет прочитан автоматически — вам нужно сделать это самостоятельно, например, с помощью пакета 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?
В предыдущих версиях Serverless Framework (<= V.3) конфигурацию useDotEnv в serverless.yml нужно было установить, чтобы загружать файлы .env и [stage].env и делать их переменные среды доступными внутри serverless.yml.
В версии V.4 эти файлы считываются автоматически, без свойства useDotEnv. Это означает, что вы можете автоматически получить доступ к переменным .env внутри serverless.yml, а не в лямбда-среде.
Решение
Вам необходимо настроить переменные среды лямбда вручную в serverless.yml
Если вы хотите изменить конфигурацию конкретной функции, добавив свойство объекта 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
Или, если вы хотите применить конфигурацию переменной среды ко всем функциям вашего сервиса, вы можете добавить конфигурацию к объекту более высокого уровня provider.
provider:
name: aws
runtime: nodejs20.x
environment:
HOSTAWAY_API_KEY: ${env:HOSTAWAY_API_KEY}
HOSTAWAY_ID: ${env:HOSTAWAY_ID}
Вам необходимо настроить env в объекте
environmentв конфигурации функции.