2016-10-25 2 views
0

Ich habe eine aktuelle App, die ich aktualisieren, um die Express Node.js-Bibliothek zu verwenden. Ich habe die Grunt.js-Aufgaben aktualisiert, um das grunt-express-server-Paket zu verwenden. Ein Teil meines Codes versucht, auf den Inhalt einer JSON-Datei zuzugreifen (siehe Verzeichnisstruktur unten). Es wird mit dem Server ganz gut, aber wenn ich versuche, um die statische Datei zuzugreifen ich die folgende Fehlermeldung erhalten:Running Grunt Express Server verursacht Fehler: ENOENT: keine solche Datei oder Verzeichnis, öffnen 'static/test.json'

Error: ENOENT: no such file or directory, open 'static/test.json' 
    at Error (native) 
    at Object.fs.openSync (fs.js:549:18) 
    at Object.fs.readFileSync (fs.js:397:15) 
    at /Users/owen/src/projects/node-express-cannot-get/build/index.js:13:32 
    at Layer.handle [as handle_request] (/Users/owen/src/projects/node-express-cannot-get/node_modules/express/lib/router/layer.js:95:5) 
    at next (/Users/owen/src/projects/node-express-cannot-get/node_modules/express/lib/router/route.js:131:13) 
    at Route.dispatch (/Users/owen/src/projects/node-express-cannot-get/node_modules/express/lib/router/route.js:112:3) 
    at Layer.handle [as handle_request] (/Users/owen/src/projects/node-express-cannot-get/node_modules/express/lib/router/layer.js:95:5) 
    at /Users/owen/src/projects/node-express-cannot-get/node_modules/express/lib/router/index.js:277:22 
    at Function.process_params (/Users/owen/src/projects/node-express-cannot-get/node_modules/express/lib/router/index.js:330:12) 

Ich denke, das etwas mit meiner Verzeichnisstruktur zu tun hat und wo der Express Server wird ausgeführt . Meine Grunt-Aufgaben kopieren alle meine Quelldateien aus einem Ordner namens src (der meine index.js enthält) in einen Ordner namens Build und führt dann den Server aus der Gruntfile, die im Stammverzeichnis ist. Wenn ich cd in den Build-Ordner und index.js direkt ausführen (node index.js), verschwindet der Fehler. Wenn Sie es jedoch über die Grunntask ausführen, wird der Fehler ausgegeben.

Wie kann ich dieses Problem beheben, ohne meine Verzeichnisstruktur zu ändern? Gibt es eine Möglichkeit, die Grunt Express Server-Aufgabe zu ändern, wo sie ausgeführt wird? Oder gibt es einen anderen Grund für dieses Problem?

Bitte siehe mein Verzeichnis sturcture und Codebeispiele unter:

Verzeichnisstruktur (nach Grunt Aufgaben abgeschlossen haben)

/ 
    build/ 
    static/ 
     test.json 
    index.js 
    node_modules/ 
    src/ 
    static/ 
     test.json 
    index.js 
    Gruntfile.js 
    package.json 

Gruntfile.js

module.exports = function (grunt) { 
    require('load-grunt-tasks')(grunt); 
    grunt.config.merge({ 
     clean: { 
      dev: ['build'] 
     }, 
     mkdir: { 
      build: { 
       options: { 
        mode: 0755, 
        create: ['build'] 
       } 
      } 
     }, 
     copy: { 
      dev: { 
       files: [{ 
        expand: true, 
        cwd: 'src', 
        src: ['index.js', 'static/**/*'], 
        dest: 'build' 
       }] 
      } 
     }, 
     express: { 
      dev: { 
       options: { 
        'script': 'build/index.js', 
        'port': 2000 
       } 
      } 
     }, 
     watch: { 
      index: { 
       files: ['index.js'], 
       tasks: ['clean', 'mkdir', 'copy'] 
      } 
     } 
    }); 
    grunt.registerTask('default', [ 
     'clean:dev', 
     'mkdir:build', 
     'copy:dev', 
     'express:dev', 
     'watch:index' 
    ]); 
}; 

src /index.js

var express = require('express'); 
var path = require('path'); 
var fs = require('fs'); 

var app = express(); 

app.set('port', (process.env.PORT || 2000)); 

app.use('/', express.static(path.join(__dirname, '/'))); 

app.get('/', function (req, res) { 
    configurationPath = 'static/test.json'; 
    // I beleive this is where the problem happens... 
    var configurationJSON = fs.readFileSync([configurationPath].join("")).toString(); 
    console.log('configurationJSON', configurationJSON); 
    res.send('Hello world'); 
}); 

app.listen(app.get('port'), function() { 
    console.log('It\'s all go on port: ' + app.get('port')); 
}); 
+0

ist die 'mkdir' hier wirklich notwendig? versuchen Sie es auch 'build/static' zu spezifizieren (so dass die 'mkdir' Aufgabe es mit den entsprechenden Rechten vergibt), oder verlieren Sie es komplett (also ist die' copy' Aufgabe verantwortlich für das Gewähren von Standardberechtigungen) –

+0

versuchen Sie auch explizit anzugeben a relativer Pfad in Ihrer * index.js * -Datei; set 'configurationPath' zu'./static/test.json' –

+0

Danke @EliranMalka, die Antwort unten löste mein Problem. Können Sie bitte erklären, warum 'mkdir' nicht notwendig ist? Wäre nur die 'copy'-Aufgabe ausreichend? Ich bin ziemlich neu bei Grunt.js. – shrewdbeans

Antwort

2

Der Aufruf von readFileSync in index.js versagt, weil sie einen relativen Pfad übergeben wird - 'static/test.json' - und das aktuelle Verzeichnis ist nicht das, was Sie denken, es ist. Das aktuelle Verzeichnis ist das Verzeichnis mit dem package.json darin - nicht das build Verzeichnis.

Wenn Sie __dirname verwenden - wie Sie mit der static Middleware getan haben - es sollte Ihr Problem lösen:

var configurationPath = path.join(__dirname, 'static/test.json'); 
Verwandte Themen