错误:ENOENT:Angular2 和 Express.js 没有这样的文件或目录

Posted

技术标签:

【中文标题】错误:ENOENT:Angular2 和 Express.js 没有这样的文件或目录【英文标题】:Error: ENOENT: no such file or directory with Angular2 and Express.js 【发布时间】:2016-12-02 04:52:51 【问题描述】:

我正在对this sample Angular2 app on GitHub 进行细微修改,以便它使用 Express.js 而不是 KOA。但目前,当我尝试在 FireFox 中加载应用程序时,nodemon 控制台中会打印以下错误:

Error: ENOENT: no such file or directory

当对localhost : 8080 的http 请求触发* 路由器处理程序时,Angular2 应用程序开始加载,该处理程序返回index.html,然后触发一系列嵌套依赖项的回调,其中一个抛出错误并停止中途加载应用程序。

需要对 GitHub 示例中的代码进行哪些具体更改才能解决Error: ENOENT: no such file or directory


背景和代码:
这是 router.js 的新替代品,它使用 Express.js 而不是 KOA:
'use strict';
let uuid = require('node-uuid');
var path = require('path');
let jwt = require('jsonwebtoken');
let config = require('./config');

// expose the routes to our app with module.exports
module.exports = function(app) 

    //all other methods omitted here for brevity

    app.get('*', function(req, res) 
        console.log('inside * route!');           
        if(req.url === '/')
            res.sendFile(path.resolve('dist/client/index.html')); // load the single view file (angular will handle the front-end)
         else 
            res.sendFile(path.resolve('./dist/client' + req.url));
        
    );
;

localhost : 8080 的请求的nodemon 控制台输出触发上述Express.js app.get('*'...) 方法反复导致错误是:

App listening on port 8080
inside * route!
GET / 304 54.261 ms - -
inside * route!
inside * route!
inside * route!
GET /boot.css 304 4.637 ms - -
GET /boot.js 304 4.447 ms - -
GET /vendor.js 304 3.742 ms - -
inside * route!
GET /vendor.js.map 200 3.180 ms - 3115631
inside * route!
GET /boot.js.map 200 2.366 ms - 61810
inside * route!
GET /bootstrap.css.map 404 2.515 ms - 169
Error: ENOENT: no such file or directory, stat '/home/user/nodejs_apps/angular2_oauth_seed_app/dist/client/bootstrap.css.map'
    at Error (native)

指定 Express.js 的新 server/index.js 是:

// set up ======================================================================
var express  = require('express');
var app      = express();                               // create our app w/ express
var port     = process.env.PORT || 8080;                // set the port
var morgan = require('morgan');             // log requests to the console (express4)
var bodyParser = require('body-parser');    // pull information from HTML POST (express4)
var methodOverride = require('method-override'); // simulate DELETE and PUT (express4)

app.use('/static', express.static(__dirname + '/dist/client'));
app.use(morgan('dev'));                                         // log every request to the console
app.use(bodyParser.urlencoded('extended':'true'));            // parse application/x-www-form-urlencoded
app.use(bodyParser.json());                                     // parse application/json
app.use(bodyParser.json( type: 'application/vnd.api+json' )); // parse application/vnd.api+json as json
app.use(methodOverride());
app.use('/scripts', express.static(__dirname + '/node_modules/'));

// load the routes
require('./router')(app);

// listen (start app with node server.js) ======================================
app.listen(port);
console.log("App listening on port " + port);

GitHub 示例应用程序中的所有其他内容都与您在 GitHub 上看到的相同,但 package.json 除外,它仅包含支持 router.jsindex.js 更改的依赖项如上图所示。

【问题讨论】:

Error: ENOENT: no such file or directory,没有这样的文件。在发送之前,您应该始终检查文件统计信息。而且您不太可能需要手动发送文件。 也许你应该试试path.resolve(__dirnamne, 'dist/client/index.html')。 (加__dirname解决) @MoLow 您的建议导致错误,指出__dirname 未在router.js 中定义 【参考方案1】:

bootstrap.css.map 表示您的浏览器正在尝试为 Bootstrap CSS 加载源映射(这是一个调试工具)。

只有在您打开浏览器的开发人员工具时才会发生这种情况,因此严格来说不是问题(除非您想实际调试 Bootstrap 的 CSS)。除此之外,总是有可能请求其他 URL 并产生相同的错误。

一种解决方案是向sendFile 添加显式错误处理程序,并假设发生错误时是因为文件不存在(因此它应该产生 404 响应):

res.sendFile(path.resolve('./dist/client' + req.url), (err) => 
  if (err) return res.sendStatus(404);
);

【讨论】:

@FirstOfMany 你可能想要一个 Gulp 任务,将 Bootstrap 源映射复制到 Express 可以找到它的位置 (./dist/client)。 感谢您和 +1 在这里增加价值。该解决方案不需要新的 Gulp 任务,因为客户端中的任何内容都与以前的版本相比没有任何变化。

以上是关于错误:ENOENT:Angular2 和 Express.js 没有这样的文件或目录的主要内容,如果未能解决你的问题,请参考以下文章

Cordova 安装错误:路径问题 (?) - 错误代码 ENOENT

如何阅读 npm ENOENT 错误

无法构建科尔多瓦流星应用程序(错误:ENOENT)

Laravel 5.8 npm run dev 生成 ENOENT 错误

错误:ENOENT:没有这样的文件或目录,stat ... .steampath

节点:错误:ENOENT,readdir