nodejs ist installiert - npm start zeigt aber Fehler
ebody
- node
- node.js
Hallo,
ich habe node installiert und wollte node mit npm start
für einen bestimmten Ordner (zu dem ich im Terminal gewechselt bin) in VS Code starten.
Die Datei package.json
existiert nicht in dem Verzeichnis: D:\projekte\spielplatz\js\muster-oop\package.json
Gruß ebody
Was muss ich machen, damit diese Datei dort erstellt wird?
D:\projekte\spielplatz\js\muster-oop\> npm init
Was Du gefragt wirst kann ich Dir zeigen:
Press ^C at any time to quit.
package name: (npm_test)
version: (1.0.0)
description:
git repository:
keywords:
author:
license: (ISC)
About to write to /home/fastix/tmp/npm_test/package.json:
{
"name": "npm_test",
"version": "1.0.0",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC",
"description": ""
}
Is this OK? (yes)
In Klammern gesetzte Strings sind die Defaults, welche bei ENTER
übernommen werden.
Ergebnis:
~/tmp/npm_test$ ll -A
insgesamt 8
-rw-rw-r-- 1 fastix fastix 204 Aug 30 11:51 package.json
-rw-rw-r-- 1 fastix fastix 203 Aug 30 11:45 package-lock.json
Den in der package.json ersichtlichen test startest Du mit
(DIR)> npm test
> npm_test@1.0.0 test
> echo "Error: no test specified" && exit 1
Error: no test specified
Danke, die package.json
Datei zu erstellen hat schon mal funktioniert. Jetzt wollte ich, dass sich bei npm start
ein Browser Fenster und die Datei index.html
öffnet.
Dafür habe ich folgende Module installiert...:
npm install http-server --save-dev
npm install concurrently --save-dev
npm install open
...und "scripts" in package.json
diese beiden Zeilen zugefügt:
"start": "npm run open",
"open": "concurrently \"http-server -a localhost -p 1234\" \"open http://localhost:1234/index.html\""
Die gesamte package.json
{
"name": "muster-oop",
"version": "1.0.0",
"description": "",
"main": "index.html",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"start": "npm run open",
"open": "concurrently \"http-server -a localhost -p 1234\" \"open http://localhost:1234/index.html\""
},
"author": "",
"license": "ISC",
"devDependencies": {
"http-server": "^14.1.1"
}
}
Das führt aber zu dieser Fehlermeldung:
open
ist nicht falsch geschrieben, warum wird es nicht gefunden?
Gruß ebody
Mit Deiner package.json und einer Datei index.html habe wie wie folgt getan:
~/tmp/npm_test$ npm install http-server
~/tmp/npm_test$ npm install concurrently
~/tmp/npm_test$ npm run open
Der Standard-Browser startete und zeige mir (wie erwartet) die index.html vom localhost, Port 1234.
Du kannst die Zeilen
"test": "echo \"Error: no test specified\" && exit 1",
"start": "npm run open",
aus der package.json also rauswerfen.
Fazit: Es liegt also am „Das“- Genau den relevanten Startbefehl hast Du sehr sorgfältig verborgen...
Genau den relevanten Startbefehl hast Du sehr sorgfältig verborgen...
Meinst du npm run open
oder welchen Start Befehl? Ich habe die beiden Zeilen entfernt und npm run open
ausgeführt und erhalte die Fehlermeldung die ich zuvor auch erhalten habe.
Der Befehl "open" ist entweder falsch geschrieben oder konnte nicht gefunden werden.
Gruß ebody
Genau den relevanten Startbefehl hast Du sehr sorgfältig verborgen...
Meinst du
npm run open
Ja.
cd ~/tmp
mkdir npm_test
cd npm_test
npm install open
npm install concurrently
npm install http-server
edit package.json
----------------------------------------------
{
"name": "muster-oop",
"version": "1.0.0",
"description": "",
"main": "index.html",
"scripts": {
"open": "concurrently \"http-server -a localhost -p 1234\" \"open http://localhost:1234/index.html\""
},
"author": "",
"license": "ISC",
"devDependencies": {
"http-server": "^14.1.1"
}
}
----------------------------------------------
edit index.html
----------------------------------------------
<h1>Hallo Welt</h1>
----------------------------------------------
npm run open
oder npm run-script open
im Verzeichnis mit der package.json starten jetzt Webserver und Browser.
Nach der Änderung der Zeile in der package.json zu
"foo": "concurrently \"http-server -a localhost -p 1234\" \"open http://localhost:1234/index.html\""
eben npm run foo
oder npm run-script foo
.
Ach so.
1. Frage: Hast Du in der Datei package-lock.json einen Eintrag wie diesen?
"node_modules/open": {
"version": "8.4.0",
"resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz",
"integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==",
"dependencies": {
"define-lazy-prop": "^2.0.0",
"is-docker": "^2.1.1",
"is-wsl": "^2.2.0"
},
wenn nicht, schlug womöglich das
npm install open
fehl.
Zeige mal die alle Ausgaben des Befehls. Dieses Mal bitte als Text, man kann auch im Windows-Terminal kopieren!
2. Wenn ich das im falschen Verzeichnis mache, dann kommen u.a. folgende Fehlermeldungen:
npm ERR! Require stack:
npm ERR! - /usr/share/nodejs/npm/lib/utils/open-url.js
npm ERR! - /usr/share/nodejs/npm/lib/commands/help.js
npm ERR! - /usr/share/nodejs/npm/lib/npm.js
npm ERR! - /usr/share/nodejs/npm/lib/cli.js
npm ERR! - /usr/share/nodejs/npm/bin/npm-cli.js
Da der Webserver ja startet, der Fehler offenbar erst beim gewollten Start des Browsers auftritt vermute ich, dass Dir Dein Pendant zu /usr/share/nodejs/npm/lib/utils/open-url.js
fehlt.
Ich kann den Browser aber auch direkt starten:
Registriere in der package.json zusätzlich
"serverbrowser": "concurrently \"http-server -a localhost -p 1234\" \"chromium-browser http://localhost:1234/index.html\""
(Ersetze „chromium-browser“ durch den Befehl mit dem Du einen Browser im Terminal starten kannst.)
als Skript und starte
npm run serverbrowser
Zur womöglich fehlenden Libary:
Hier meine Installations-Liste:
apt list *node* | grep -i installiert | sed -e 's/\/.*$//'
WARNING: apt does not have a stable CLI interface. Use with caution in scripts.
libnode-dev
libnode72
node-abbrev
node-agent-base
node-ansi-regex
node-ansi-styles
node-ansistyles
node-aproba
node-archy
node-are-we-there-yet
node-asap
node-balanced-match
node-brace-expansion
node-builtins
node-cacache
node-chalk
node-chownr
node-cli-table
node-clone
node-color-convert
node-color-name
node-colors
node-columnify
node-console-control-strings
node-copy-concurrently
node-core-util-is
node-debug
node-decompress-response
node-defaults
node-delegates
node-depd
node-encoding
node-end-of-stream
node-err-code
node-escape-string-regexp
node-events
node-fancy-log
node-fs-write-stream-atomic
node-fs.realpath
node-function-bind
node-gauge
node-get-stream
node-glob
node-got
node-graceful-fs
node-gyp
node-has-flag
node-has-unicode
node-hosted-git-info
node-https-proxy-agent
node-iconv-lite
node-iferr
node-imurmurhash
node-indent-string
node-inflight
node-inherits
node-ini
node-ip-regex
node-ip
node-is-typedarray
node-isarray
node-isexe
node-json-buffer
node-json-parse-better-errors
node-jsonparse
node-lowercase-keys
node-lru-cache
node-mimic-response
node-minimatch
node-minipass
node-mkdirp
node-move-concurrently
node-ms
node-mute-stream
node-negotiator
node-nopt
node-normalize-package-data
node-npm-bundled
node-npm-package-arg
node-npmlog
node-object-assign
node-once
node-osenv
node-p-cancelable
node-p-map
node-path-is-absolute
node-performance-now
node-process-nextick-args
node-promise-inflight
node-promise-retry
node-promzard
node-pump
node-quick-lru
node-read-package-json
node-read
node-readable-stream
node-resolve
node-retry
node-rimraf
node-run-queue
node-safe-buffer
node-semver
node-set-blocking
node-signal-exit
node-slash
node-slice-ansi
node-spdx-correct
node-spdx-exceptions
node-spdx-expression-parse
node-spdx-license-ids
node-ssri
node-string-decoder
node-string-width
node-strip-ansi
node-supports-color
node-tar
node-text-table
node-time-stamp
node-typedarray-to-buffer
node-unique-filename
node-util-deprecate
node-validate-npm-package-license
node-validate-npm-package-name
node-wcwidth.js
node-whatwg-fetch
node-which
node-wide-align
node-wrappy
node-write-file-atomic
node-yallist
nodejs
Wie das unter Windows geht weiß ich nicht.
- Frage: Hast Du in der Datei package-lock.json einen Eintrag wie diesen?
Ja. Aber dennoch gut zu wissen.
Zeige mal die alle Ausgaben des Befehls.
npm run open
> muster-oop@1.0.0 open D:\projekte\spielplatz\js\muster-oop
> concurrently "http-server -a localhost -p 8080" "open http://localhost:8080/index.html"
[1] Der Befehl "open" ist entweder falsch geschrieben oder
[1] konnte nicht gefunden werden.
[1] open http://localhost:8080/index.html exited with code 1
[0] Starting up http-server, serving ./
[0]
[0] http-server version: 14.1.1
[0]
[0] http-server settings:
[0] CORS: disabled
[0] Cache: 3600 seconds
[0] Connection Timeout: 120 seconds
[0] Directory Listings: visible
[0] AutoIndex: visible
[0] Serve GZIP Files: false
[0] Serve Brotli Files: false
[0] Default File Extension: none
[0]
[0] Available on:
[0] http://localhost:8080
[0] Hit CTRL-C to stop the server
[0]
Registriere in der package.json zusätzlich
Habe ich gemacht, so richtig?
{
"name": "muster-oop",
"version": "1.0.0",
"description": "",
"main": "index.html",
"serverbrowser": "concurrently \"http-server -a localhost -p 1234\" \"http-server http://localhost:1234/index.html\"",
"scripts": {
"open": "concurrently \"http-server -a localhost -p 1234\" \"open http://localhost:1234/index.html\""
},
"author": "",
"license": "ISC",
"devDependencies": {
"concurrently": "^7.3.0",
"http-server": "^14.1.1"
},
"dependencies": {
"open": "^8.4.0"
}
}
(Gleiche) Fehlermeldung erscheint immer noch, wenn ich npm run open
ausführe. Führe ich npm run serverbrowser
aus erscheint
npm ERR! missing script: serverbrowser
package.json habe ich noch mal angepasst und...
"serverbrowser": "concurrently \"http-server -a localhost -p 1234\" \"http-server http://localhost:1234/index.html\""
...ins scripts
Objekt eingefügt.
{
"name": "muster-oop",
"version": "1.0.0",
"description": "",
"main": "index.html",
"scripts": {
"open": "concurrently \"http-server -a localhost -p 1234\" \"open http://localhost:1234/index.html\"",
"serverbrowser": "concurrently \"http-server -a localhost -p 1234\" \"http-server http://localhost:1234/index.html\""
},
"author": "",
"license": "ISC",
"devDependencies": {
"concurrently": "^7.3.0",
"http-server": "^14.1.1"
},
"dependencies": {
"open": "^8.4.0"
}
}
npm run serverbrowser
ausgeführt und erhalte keine Fehlermeldung:
[0] Starting up http-server, serving ./
[1] Starting up http-server, serving http://localhost:1234/index.html
[0]
[0] http-server version: 14.1.1
[0]
[0] http-server settings:
[0] CORS: disabled
[0] Cache: 3600 seconds
[0] Connection Timeout: 120 seconds
[0] Directory Listings: visible
[0] AutoIndex: visible
[0] Serve GZIP Files: false
[0] Serve Brotli Files: false
[0] Default File Extension: none
[0]
[0] Available on:
[0] http://localhost:1234
[0] Hit CTRL-C to stop the server
[0]
[1]
[1] http-server version: 14.1.1
[1]
[1] http-server settings:
[1] CORS: disabled
[1] Cache: 3600 seconds
[1] Connection Timeout: 120 seconds
[1] Directory Listings: visible
[1] AutoIndex: visible
[1] Serve GZIP Files: false
[1] Serve Brotli Files: false
[1] Default File Extension: none
[1]
[1] Available on:
[1] http://192.168.178.21:8080
[1] http://127.0.0.1:8080
[1] Hit CTRL-C to stop the server
[1]
Gebe ich http://localhost:1234/ in den Browser ein oder führe in VS Code "Run and Debug" aus, öffnet sich die index.html.
Vielen Dank für die Hilfe, jetzt funktioniert es.
Gruß ebody
jetzt funktioniert es.
Das könnte man meinen.
Mich verwirrt aber
[0] Starting up http-server, serving ./
[1] Starting up http-server, serving http://localhost:1234/index.html
[0]
…
[0] http-server version: 14.1.1
[0] Available on:
[0] http://localhost:1234
[0] Hit CTRL-C to stop the server
…
[1] http-server version: 14.1.1
[1] Available on:
[1] http://192.168.178.21:8080
[1] http://127.0.0.1:8080
[1] Hit CTRL-C to stop the server
Hast Du zwei HTTP-Server mit npm gestartet?
Immerhin ist ja einer der beiden (auf Port 8080) offenbar vom gesamten Netz aus erreichbar und zeigt (wohl) Dein gesamtes Dateisystem!.
Und in der gezeigten package.json steht nichts, aber auch gar nichts, was diesen startet.
Jetzt noch was zur Fehlermeldung…
"scripts": {
"open": "concurrently \"http-server -a localhost -p 1234\" \"open http://localhost:1234/index.html\"",
"serverbrowser": "concurrently \"http-server -a localhost -p 1234\" \"http-server http://localhost:1234/index.html\""
},
Das sieht falsch aus: Dein "Serverbrowser" versucht zwei mal den Webserver auf Port 1234 zu starten!
Ich hatte übrigens geschrieben:
"serverbrowser":
"concurrently
\"http-server -a localhost -p 1234\"
\"chromium-browser http://localhost:1234/index.html\"
"
(jetzt aber mit extra-Zeilenumbrüchen)
Ich „nehme jetzt mal auseinander“, was Du notieren solltest:
// registriere folgende Befehle für den Start mit `npm run[-script]`
"scripts": {
// Name eines Scriptes:
"serverbrowser":
// Es das Package „concurrently“ wird aufgerufen,
// welches einen Befehl/Programm starten kann,
// nicht auf dessen Ergebnis wartet
// und einen weiteren Befehl/Programm startet:
"concurrently
// Starte das nodejs-Modul http-server, übergib als Argument
// \"http-server -a localhost -p 1234\"
// Der läuft dann im Hintergrund
// Starte das Programm „chromium-browser“
// es soll gleich die Webseite öffnen:
\"chromium-browser http://localhost:1234/index.html\"
// Liste der Skripte/Programme schließen:
"
„chromium-browser" ist hierbei der Browser in meinem System. Du müsstest dort etwas eintragen, was Deinen Browser startet und eine Webseite öffnet. Also: Wie startest Du Deinen Edge in einem Terminal? (Ich sitze am Raspi mit Linux und habe gerade keine Lust, den großen Rechner zu starten und Windows zu booten um das herauszufinden)
Vermutlich bezieht sich die Fehlermeldung „Der Befehl open“ sei „falsch geschrieben oder konnte nicht gefunden werden“ darauf, dass das originale
"open http://localhost:1234/index.html"
als zweiter Teil Deines ursprünglichen „Skriptes“ fehl schlug. (Der erste sollte den Webserserver starten.)
Ich denke, das npm-open
dazu das Betriebssystem befragt, welche Anwendung wohl http://links öffnen soll und wie die URL zu übergeben ist. Und dummerweise heißt dieses Stücken im internen Skript auch „open". Dieses „open“ hat entweder nichts gefunden oder einen Eintrag gefunden, der auf ein nicht existierendes Programm zeigte.
Mithin: Was passiert bei Dir, wenn Du einen Link, z.B. in einem PDF, anklickst?
Ich will aber nicht ausschließen, dass dieses „open“ (also das npm-Modul open) unter Windows entweder nicht funktioniert (soll es aber) oder aber Nacharbeit bzw. Tuning benötigt. Denn bei mir funktioniert es ja „out of the box“.
Vielleicht musst Du ja den „appname“ angeben?
In der verlinkten Doc für das npm-Modul „open“ finde ich nämlich unter anderem sowas:
// Specify app arguments.
await open('https://sindresorhus.com', {app: {name: 'google chrome', arguments: ['--incognito']}});
Jetzt addieren wir das mal zusammen:
"serverbrowser":
"concurrently
\"http-server -a localhost -p 1234\"
\"open('https://localhost:1234', {app: {name: 'edge'})\"
"
Und schon hast Du etwas zu probieren. Wie schon geschrieben kannst als zweite Zeile aber auch einen direkten Befehl notieren, der das gleiche tut.
Fund:
Reactjs - How to open the browser that you want as default with "npm start" on Windows 10