Javascript 运行Grunt Express Server会导致错误:enoint:没有这样的文件或目录,请打开';static/test.json';

Javascript 运行Grunt Express Server会导致错误:enoint:没有这样的文件或目录,请打开';static/test.json';,javascript,node.js,express,gruntjs,grunt-express-server,Javascript,Node.js,Express,Gruntjs,Grunt Express Server,我有一个当前的应用程序正在更新以使用Express Node.js库。我已经更新了Grunt.js任务以使用该包。我的部分代码尝试访问JSON文件的内容(请参阅下面的目录结构)。它可以正常运行服务器,但当我尝试访问任何静态文件时,会出现以下错误: Error: ENOENT: no such file or directory, open 'static/test.json' at Error (native) at Object.fs.openSync (fs.js:549:1

我有一个当前的应用程序正在更新以使用Express Node.js库。我已经更新了Grunt.js任务以使用该包。我的部分代码尝试访问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)
我认为这可能与我的目录结构以及运行Express服务器的位置有关。我的Grunt任务将我的所有源文件从名为src(其中包含我的index.js)的文件夹复制到名为build的文件夹,然后从根目录中的Gruntfile运行服务器。如果我将
cd
放入build文件夹并直接运行index.js(
node index.js
),错误就会消失。但是,通过Grunt任务运行它会产生错误

如何在不更改目录结构的情况下解决此问题?有没有办法改变Grunt Express服务器任务的运行位置?或者这个问题还有其他原因吗

请参阅下面我的目录结构和代码示例:

目录结构(在Grunt任务完成后)

grunfile.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'
    ]);
};
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') );
});
src/index.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'
    ]);
};
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') );
});

在index.js中调用
readFileSync
失败,因为它传递了一个相对路径-
'static/test.json'
,而当前目录不是您所认为的目录

当前目录是包含
package.json
的目录,而不是
build
目录

如果您使用
\uuu dirname
——就像您使用
静态
中间件一样——它应该可以解决您的问题:

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

在index.js中调用
readFileSync
失败,因为它传递了一个相对路径-
'static/test.json'
,而当前目录不是您所认为的目录

当前目录是包含
package.json
的目录,而不是
build
目录

如果您使用
\uuu dirname
——就像您使用
静态
中间件一样——它应该可以解决您的问题:

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

这里真的需要
mkdir
吗?同时尝试指定
build/static
(这样
mkdir
任务会授予它适当的权限),或者完全失去它(这样
copy
任务会负责授予默认权限),另外,尝试在index.js文件中显式指定相对路径;将
configurationPath
设置为
/static/test.json
谢谢@EliranMalka,下面的答案解决了我的问题。你能解释一下为什么不需要
mkdir
?只需执行
copy
任务就足够了吗?我对Grunt.js相当陌生。只是因为我没有使用过它,在任何情况下,拷贝对我来说都是足够的。
mkdir
在这里真的有必要吗?同时尝试指定
build/static
(这样
mkdir
任务会授予它适当的权限),或者完全失去它(这样
copy
任务会负责授予默认权限),另外,尝试在index.js文件中显式指定相对路径;将
configurationPath
设置为
/static/test.json
谢谢@EliranMalka,下面的答案解决了我的问题。你能解释一下为什么不需要
mkdir
?只需执行
copy
任务就足够了吗?我对Grunt.js还相当陌生,只是因为我没有使用它,而且在任何情况下,拷贝对我来说都是足够的