ebody: nodejs ist installiert - npm start zeigt aber Fehler

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.

node npm start error

Die Datei package.json existiert nicht in dem Verzeichnis: D:\projekte\spielplatz\js\muster-oop\package.json

  1. Was muss ich machen, damit diese Datei dort erstellt wird? Gibt es dafür ein Befehl, muss man die manuell erstellen?
  2. In der Datei kann man dann eine Index Datei festlegen?

Gruß ebody

  1. 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
    
    1. 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:

      node open not found

      open ist nicht falsch geschrieben, warum wird es nicht gefunden?

      Gruß ebody

      1. 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...

        1. 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

          1. 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.

              • Möglicherweise musst Du aufpassen, dass das in Deiner Entwicklungsumgebung verwendete Terminal nicht durch irgendwas angewiesen wird, das Verzeichnis zu wechseln.
              • Und ich hab natürlich Linux…
          2. 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.

              1. 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

              1. Dieser Beitrag wurde gelöscht: Wurde doppelt gespeichert...
              2. 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