AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / user-275968

SkyN's questions

Martin Hope
SkyN
Asked: 2025-04-11 11:46:20 +0800 CST

O Nuxt 3 runtimeConfig não foi preenchido a partir do process.env na compilação do Docker de produção, mas o process.env estará disponível posteriormente

  • 5

Estou enfrentando um problema em que meu servidor runtimeConfigno Nuxt 3 não está sendo preenchido corretamente com variáveis ​​de ambiente ao executar a compilação de produção dentro de um contêiner Docker gerenciado pelo Docker Compose. No entanto, consigo ver o valor correto ao acessar process.envdiretamente no middleware do servidor durante uma solicitação.

Configurar:

  • Nuxt: v3
  • Nó: v20
  • Processo de compilação: Padrão npm run builddentro de uma compilação multiestágios do Docker. A etapa final é executada CMD ["node", ".output/server/index.mjs"].

Problema:

No meu nuxt.config.ts, defino uma variável de configuração de tempo de execução do lado do servidor que deve ser carregada de uma variável de ambiente:

// nuxt.config.ts
export default defineNuxtConfig({
  // ...
  runtimeConfig: {
    // This should be populated from the environment variable
    jwtSecret: process.env.JWT_SECRET,
    // ... 
  },
  // ...
})

Meu .envarquivo (usado pelo Docker Compose) define a variável:

# .env file
JWT_SECRET=a9d3fd7cee941559f18f43dd6c87fc39cf611a540ffbc6b4b1f5675b569af176
# ... other vars

Meu docker-compose.ymlpassa esta variável para o portalserviço:

# docker-compose.yml
services:
  portal:
    # ... image, build context, etc.
    environment:
      JWT_SECRET: ${JWT_SECRET}
      # ... other env vars
    # ... ports, depends_on, etc.

Quando executo uma rota de API (por exemplo, /api/auth/login.post.ts), o código tenta acessar o segredo:

// server/api/auth/login.post.ts (simplified)
import { defineEventHandler, useRuntimeConfig } from 'h3';
import jwt from 'jsonwebtoken';

export default defineEventHandler(async (event) => {
  const config = useRuntimeConfig(event);
  const secret = config.jwtSecret;

  console.log('JWT Secret value INSIDE login handler:', secret);
  console.log('Type of portalJwtSecret:', typeof secret);

  try {
    // ... authentication logic ...
    // This line throws the error because 'secret' is an empty string
    const token = jwt.sign({ userId: user.id }, secret, { expiresIn: '7d' });
    // ... return token ...
  } catch (error) {
    console.error('Login error:', error);
    // ... handle error ...
  }
});

Sintomas:

  1. Falha no login: O manipulador de login gera Error: secretOrPrivateKey must have a valueporque config.portalJwtSecreté uma string vazia ( ""), embora seu tipo seja inferido corretamente como string.
  2. Middleware Vê process.env: Adicionei um middleware de servidor ( server/middleware/log-config.ts) para verificar os valores durante uma solicitação:
    // server/middleware/log-config.ts
    import { defineEventHandler, useRuntimeConfig } from 'h3';
    export default defineEventHandler((event) => {
      const config = useRuntimeConfig(event);
      console.log('[Middleware log-config] JWT Secret:', config.jwtSecret);
      console.log('[Middleware log-config] Type of portalJwtSecret:', typeof config.jwtSecret);
      console.log('[Middleware log-config] process.env.JWT_SECRET:', process.env.JWT_SECRET);
    });
    
    Os logs deste middleware mostram:
    [Middleware log-config] JWT Secret: 
    [Middleware log-config] Type of jwtSecret: string
    [Middleware log-config] process.env.JWT_SECRET: a9d3fd7cee941559f18f43dd6c87fc39cf611a540ffbc6b4b1f5675b569af176
    
    Isso mostra claramente que process.env.JWT_SECRET está definido corretamente no ambiente Node.js em execução quando a solicitação é manipulada, mas useRuntimeConfig(event).jwtSecretestá retornando uma string vazia.
  3. Constantes Funcionam: Se eu definir uma variável runtimeConfigdiretamente como uma string literal (por exemplo, someConstant: 'ThisValueWorks'), ela será corretamente acessível via useRuntimeConfig().
  4. nuxt devFunciona: Esse problema não ocorre quando executado localmente com nuxt dev; runtimeConfigé preenchido corretamente a partir do .envarquivo no modo de desenvolvimento.
  5. NUXT_Falha no prefixo: Também tentei prefixar a variável de ambiente com NUXT_(por exemplo, NUXT_JWT_SECRET) esperando preenchimento automático, mas useRuntimeConfig().jwtSecretnão foi undefinedo caso.

O que eu tentei:

  • Garantindo que não haja aspas em torno do valor no .envarquivo.
  • Verificar se o nome da variável corresponde exatamente em .env, docker-compose.yml, e nuxt.config.ts.
  • Verificando substituições em docker-compose.override.yml(nenhuma encontrada).
  • Parando contêineres ( docker compose down), removendo .nuxt, .output, node_modules, executando npm installe reconstruindo ( docker compose up --build -d --force-recreate).
  • Usando nomes de variáveis ​​diferentes ( JWT_SECRET, PORTAL_JWT_SECRET, NUXT_PORTAL_JWT_SECRET).
  • A confirmação process.env.VAR_NAMEpode ser acessada por meio de logs de middleware.

Pergunta:

Por que useRuntimeConfig()retornar uma string vazia para variáveis ​​do lado do servidor é definido via process.envin nuxt.config.tsao executar a compilação de produção ( .output/server/index.mjs)? Como posso garantir runtimeConfigque a inicialização com essas variáveis ​​de ambiente seja feita corretamente na inicialização do servidor dentro do contêiner do Docker?

nuxt.js
  • 1 respostas
  • 20 Views

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Reformatar números, inserindo separadores em posições fixas

    • 6 respostas
  • Marko Smith

    Por que os conceitos do C++20 causam erros de restrição cíclica, enquanto o SFINAE antigo não?

    • 2 respostas
  • Marko Smith

    Problema com extensão desinstalada automaticamente do VScode (tema Material)

    • 2 respostas
  • Marko Smith

    Vue 3: Erro na criação "Identificador esperado, mas encontrado 'import'" [duplicado]

    • 1 respostas
  • Marko Smith

    Qual é o propósito de `enum class` com um tipo subjacente especificado, mas sem enumeradores?

    • 1 respostas
  • Marko Smith

    Como faço para corrigir um erro MODULE_NOT_FOUND para um módulo que não importei manualmente?

    • 6 respostas
  • Marko Smith

    `(expression, lvalue) = rvalue` é uma atribuição válida em C ou C++? Por que alguns compiladores aceitam/rejeitam isso?

    • 3 respostas
  • Marko Smith

    Um programa vazio que não faz nada em C++ precisa de um heap de 204 KB, mas não em C

    • 1 respostas
  • Marko Smith

    PowerBI atualmente quebrado com BigQuery: problema de driver Simba com atualização do Windows

    • 2 respostas
  • Marko Smith

    AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos

    • 1 respostas
  • Martin Hope
    Fantastic Mr Fox Somente o tipo copiável não é aceito na implementação std::vector do MSVC 2025-04-23 06:40:49 +0800 CST
  • Martin Hope
    Howard Hinnant Encontre o próximo dia da semana usando o cronógrafo 2025-04-21 08:30:25 +0800 CST
  • Martin Hope
    Fedor O inicializador de membro do construtor pode incluir a inicialização de outro membro? 2025-04-15 01:01:44 +0800 CST
  • Martin Hope
    Petr Filipský Por que os conceitos do C++20 causam erros de restrição cíclica, enquanto o SFINAE antigo não? 2025-03-23 21:39:40 +0800 CST
  • Martin Hope
    Catskul O C++20 mudou para permitir a conversão de `type(&)[N]` de matriz de limites conhecidos para `type(&)[]` de matriz de limites desconhecidos? 2025-03-04 06:57:53 +0800 CST
  • Martin Hope
    Stefan Pochmann Como/por que {2,3,10} e {x,3,10} com x=2 são ordenados de forma diferente? 2025-01-13 23:24:07 +0800 CST
  • Martin Hope
    Chad Feller O ponto e vírgula agora é opcional em condicionais bash com [[ .. ]] na versão 5.2? 2024-10-21 05:50:33 +0800 CST
  • Martin Hope
    Wrench Por que um traço duplo (--) faz com que esta cláusula MariaDB seja avaliada como verdadeira? 2024-05-05 13:37:20 +0800 CST
  • Martin Hope
    Waket Zheng Por que `dict(id=1, **{'id': 2})` às vezes gera `KeyError: 'id'` em vez de um TypeError? 2024-05-04 14:19:19 +0800 CST
  • Martin Hope
    user924 AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos 2024-03-20 03:12:31 +0800 CST

Hot tag

python javascript c++ c# java typescript sql reactjs html

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve