Ich verwende node.js, um eine Webanwendung zu erstellen. Wenn ich die Anwendung ausführe (entweder durch Öffnen von index.html im Browser oder durch Verwenden des Befehls „npm start“ auf dem Terminal), erhalte ich zwei Fehler:
Nicht erfasster Referenzfehler: Prozess ist nicht definiert
Nicht erfasster ReferenceError: require ist nicht definiert
Ich habe den Fehler „erforderlich ist nicht definiert“ gelöst, indem ich speziell den Link zu in mein Head-Tag index.html aufgenommen habe Dies -Skript, in dem die erforderliche Funktion definiert ist. Allerdings kann ich nichts Ähnliches für die Prozessfunktion finden.
Meine Frage ist zweigeteilt:
-
Warum müssen integrierte node.js-Module neu definiert werden? Warum werden sie nicht so erkannt, wie sie sind, also “eingebaute Module”? Bedeutet der Begriff “eingebautes Modul” nicht, dass ein Modul nicht extern/aus zweiter Hand neu definiert werden muss?
-
Gibt es eine Möglichkeit, dieses Problem zu lösen? Mein Skript ist sehr einfach, ich versuche nur, eine grundlegende Funktion von node.js zu verwenden, daher kann ich nicht herausfinden, welche Fehler ich möglicherweise gemacht habe.
Wenn jemand auf dieses Problem gestoßen ist und einen Weg gefunden hat, es zu umgehen, oder einen Grund dafür gefunden hat, wären Sie eine große Hilfe.
Node.js-Code muss vom Knotenprozess ausgeführt werden, nicht vom Browser (der Code muss auf dem Server ausgeführt werden).
Um den Code auszuführen, müssen Sie den Befehl ausführen:
node server.js
Und dann können Sie von einem Browser aus auf Ihren Server zugreifen, indem Sie “http://localhost:8080” zum Beispiel. Sie müssen eine Datei server.js (oder was auch immer) mit dem gewünschten Servercode haben (in diesem Fall erstellen Sie einen Webserver in Port 8080).
Sie können diesem einfachen Beispiel folgen, indem Sie Express als HTTP-Servermodul verwenden: http://expressjs.com/starter/hello-world.html
Webpack kann Umgebungsvariablen in den „clientseitigen“ .js-Code einfügen (sehr nützlich im Fall von SPA/PWA). Sie sollten sie als Plugins in webpack.config.js definieren
webpack.config.js
module.exports = {
plugins: [
new webpack.DefinePlugin({
'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV),
'process.env.MY_ENV': JSON.stringify(process.env.MY_ENV),
... and so on ...
})
],
}
Jetzt können Sie auf der Clientseite darauf zugreifen:
app.js
// Something like that
if(process.env.NODE_ENV === 'debug'){
setDebugLevel(1)
}
Wenn Sie mit diesem Problem konfrontiert sind und Webpack verwenden, können Sie das gewünschte erhalten process
Daten, die mithilfe von in das Client-Bundle eingefügt werden DefinePlugin
in deinem webpack.config.js
.
Im folgenden Beispiel zeige ich, wie Sie mehrere Dinge hinzufügen können process.env
Objekt im Browser verfügbar zu machen:
- alle Umgebungsvariablen darin
.env
Nutzung der Bibliothek
dotenv
- der Wert von
NODE_ENV
das ist entweder 'development'
oder 'production'
Arbeitsbeispiel
# .env
API_KEY=taco-tues-123
API_SECRET=secret_tacos
// webpack.config.js
const dotenv = require('dotenv').config({ path: __dirname + '/.env' })
const isDevelopment = process.env.NODE_ENV !== 'production'
module.exports = {
plugins: [
new webpack.DefinePlugin({
'process.env': JSON.stringify(dotenv.parsed),
'process.env.NODE_ENV': JSON.stringify(isDevelopment ? 'development' : 'production'),
}),
].filter(Boolean),
}
// Within client side bundle (React)
// src/App.jsx
console.log(process.env) // {API_KEY: "taco-tues-123", API_SECRET: "secret_tacos"}
console.log(process.env.NODE_ENV) // development
Beachte das console.log(process.env)
hat nur die Werte aus der .env
Datei, und das NODE_ENV
ist kein Teil der process.env
Objekt.
Im Beispiel unten zeige ich, wie ich versucht habe, das zu spritzen process.env
Objekt, das mich zu diesem Stapelüberlauf geführt hat. Ich füge auch ein Highlight aus der Webpack-Dokumentation hinzu, warum der folgende Code nicht funktioniert hat.
Gebrochenes Beispiel
module.exports = {
plugins: [
new webpack.DefinePlugin({
'process.env': {
...dotenv.parsed,
'NODE_ENV': JSON.stringify(isDevelopment ? 'development' : 'production')
}
}),
].filter(Boolean),
}
// Within client side bundle (React)
// src/App.jsx
console.log(process.env) // Uncaught ReferenceError: taco is not defined
console.log(process.env.NODE_ENV) // development
Aus dem Webpaket DefinePlugin-Dokumente:
Warnung Beim Definieren von Werten für Prozess bevorzugen
'process.env.NODE_ENV': JSON.stringify('production')
Über
process: { env: { NODE_ENV: JSON.stringify('production') } }
Die Verwendung des letzteren überschreibt das Prozessobjekt, was die Kompatibilität mit einigen Modulen beeinträchtigen kann, die erwarten, dass andere Werte für das Prozessobjekt definiert werden.
!Warnung!
Injektion dotenv.parsed
wie beschrieben in das Client-Bundle einfügen, werden diese Geheimnisse dem Client offengelegt. Für Entwicklungszwecke keine große Sache, aber in einer bereitgestellten Produktionsumgebung sind alle Passwörter oder privaten API-Schlüssel für jeden sichtbar, der danach sucht.
Ich hatte das gleiche Problem gelöst, indem ich in meine .eslintrc.js-Datei gegangen bin, um meine Globals-Variablen zu konfigurieren, der Globals-Variablen require und process hinzugefügt und den entsprechenden Wert auf “beschreibbar” gesetzt habe. Hoffe, es funktioniert für Sie.
dieser Link hat wirklich geholfen
https://eslint.org/docs/user-guide/configuring#specifying-globals
Ich habe gerade diesen Fehler erhalten (Uncaught ReferenceError: process is not defined
) in einer lokalen Hot-Reloading Quasar (Vue)-App, wenn ein bestimmter Endpunkt aufgerufen wird. Die Lösung für mich bestand schließlich darin, den Hot-Reloading-Server einfach neu zu starten (ich hatte ihn nicht neu geladen, seit ich die process.env.MY_VARIABLE
Code).
Hallo allerseits! Vielen Dank, dass Sie immer noch versuchen, diese Frage zu beantworten! Diese Frage stellt sich derzeit höchstwahrscheinlich nicht (und gilt möglicherweise nicht für aktuelle Tools), da 6 Jahre vergangen sind, und in der Zwischenzeit Web-App-Technologien große Fortschritte gemacht haben und auch der Entwicklungsprozess stark vereinfacht wurde. Es ist jedoch interessant zu sehen, dass es manchmal immer noch gültig ist.
– Kantharis
25. Februar 2021 um 12:45 Uhr