J'ai un SPA avec NextJs qui soumet un formulaire de contact à une feuille Google, le formulaire fonctionne bien localement, mais en production j'obtiens une erreur 500.
Dans mon .env
fichier j'ai ce qui suit :
NEXT_PUBLIC_GOOGLE_CLIENT_EMAIL= NEXT_PUBLIC_GOOGLE_PRIVATE_KEY= NEXT_PUBLIC_GOOGLE_SHEET_ID=
J'ai de vrais secrets dans mon .env.local
dossier,
Voici mon submit.js
fichier
import { google } from 'googleapis' require('dotenv-flow').config() export default async function handler(req, res) { if (req.method !== 'POST') { return res.status(405).send('Only POST requests are allowed!') } // log to see the secret which are visible in local console.log('process.env', process.env) console.log( 'email process with error ', process.env.NEXT_PUBLIC_GOOGLE_CLIENT_EMAIL ) const body = req.body try { const auth = new google.auth.GoogleAuth({ credentials: { client_email: process.env.NEXT_PUBLIC_GOOGLE_CLIENT_EMAIL, private_key: process.env.NEXT_PUBLIC_GOOGLE_PRIVATE_KEY?.replace( /\n/g, '\n' ), }, scopes: [ 'https://www.googleapis.com/auth/drive', 'https://www.googleapis.com/auth/drive.file', 'https://www.googleapis.com/auth/spreadsheets', ], }) const sheets = google.sheets({ auth, version: 'v4', }) const submittedAt = new Date().toUTCString() const response = await sheets.spreadsheets.values.append({ spreadsheetId: process.env.NEXT_PUBLIC_GOOGLE_SHEET_ID, range: 'A1:F1', valueInputOption: 'USER_ENTERED', requestBody: { values: [ [ body.name, body.company, body.product, body.email, body.phone, submittedAt, ], ], }, }) return res.status(201).json({ data: response.data, }) } catch (error) { console.log( 'email process with error ', process.env.NEXT_PUBLIC_GOOGLE_CLIENT_EMAIL ) // the log fo r this error is down below console.log('error.code', error) return res.status(error.code).send({ message: error.message }) } }
error.code 错误:传入的 JSON 对象不包含 client_email 字段 error.code 错误:传入的 JSON 对象不包含 client_email 字段
Ps, le secret est injecté via AWS et visible dans les journaux de surveillance du cloud.
Question 1 : dois-je inclure ces secrets dans mon Dockerfile ?
Question2, est-ce lié au CSP ? (Pas encore implémenté)
** Mise à jour
J'ai essayé de définir la clé dans le fichier docker mais cela ne fonctionne pas
J'ai également essayé d'ajouter csp avec le composant de classe à _document.js
/ ou d'ajouter la configuration suivante, mais cela n'a pas bien fonctionné
** Mise à jour Dans l'environnement de production/développement, je ne parviens pas à lire les valeurs bien qu'elles soient injectées depuis le coffre-fort
J'ai découvert que
NEXT_PUBLIC_
ne devrait pas être utilisé ici, après les avoir supprimés, cela a commencé à fonctionner. Mais un autre secret (GTM) qui devrait utiliser le préfixe ne se charge pasMises à jour et solutions
Il s'avère que j'avais besoin d'appeler
server.js
并请求env
变量:server.js
comme ceci :