我遇到了与您完全相同的问题,并为您提供了 2 种可能的解决方案!
//////////////////////////
解决方案 #1:列出您希望/不希望“提供”的目录
//////////////////////////
如何:
假设你的目录结构是这样的:
-app/
---controllers/
---directives/
---etc.
-public/
---img/
---css/
---index.html
---etc.
-views/
---home.html
---vehicle.html
---etc.
-app.js (run with 'node app.js')
这 3 个文件夹(app、public、views)中的一些文件夹具有不同的规则,您希望提供和渲染:
-
应用/
-
serve:如果您的网站执行 GET /app/controller.js,您希望向它们提供文字文件。
-
公开/
-
serve:如果您的网站确实 GET /public/img/logo.jpg,您希望向它们提供文字文件。
-
观看次数/
-
render:如果您的网站确实 GET views/home,您希望 render 他们从您的 angular.js 路由中查看视图。
现在从您的 node/express js 文件中,找到或添加以下内容:
//This tells node that these folders are for STATIC SERVING files (meaning literal files).
//And Yes! You can use multiple to indicate multiple directories.
app.use(express.static(path.join(__dirname, 'app')));
app.use(express.static(path.join(__dirname, 'public')));
更多信息:
app.use(express.static(__dirname + '/client/views')); 表示您正在从 /client/views 提供文字文件,但在该目录之外没有任何内容。见angularjs index.html in views folder
扩展示例:
这将是您可能的配置:
//app.js
var express = require('express'),
bodyParser = require('body-parser'),
methodOverride = require('method-override'),
errorHandler = require('error-handler'),
morgan = require('morgan'),
routes = require('./routes/index'), //My special routes file
http = require('http'),
path = require('path');
var app = module.exports = express();
// all environments
app.set('port', process.env.PORT || 3000);
app.set('views', __dirname + '/views');
app.set('view engine', 'jade');
app.use(morgan('dev'));
app.use(bodyParser());
app.use(methodOverride());
app.use(express.static(path.join(__dirname, 'app')));
app.use(express.static(path.join(__dirname, 'public')));
// serve index and view partials
app.get('/', routes.index);
//Partials
app.get('/partials/:name', routes.partials);
// redirect all others to the index
// BUT the static files listed above still get served statically
app.get('*', routes.index);
http.createServer(app).listen(app.get('port'), function () {
console.log('Express server listening on port ' + app.get('port'));
});
那么这就是你的路由文件:
exports.index = function(req, res){
res.render('index');
};
exports.partials = function (req, res) {
var name = req.params.name;
res.render('partials/' + name);
};
//////////////////////////
解决方案#2:先检查文件是否存在
//////////////////////////
如何:
保留你已有的一切,但不要立即尝试“res.sendFile”,而是先检查它是否存在。例如:
exports.all = function (req, res) {
var name = req.params[0];
fs.exists(path+'/'+name, function(exists){
if(exists)
{
//console.log("file exists");
res.sendFile(path+'/'+name);
}else{
//console.log("file does not exist");
//redirects to index
res.render('index');
}
});
};
扩展示例:
这将是您可能的配置:
//app.js
var express = require('express'),
bodyParser = require('body-parser'),
methodOverride = require('method-override'),
errorHandler = require('error-handler'),
morgan = require('morgan'),
routes = require('./routes/index'), //My special routes file
http = require('http'),
path = require('path');
var app = module.exports = express();
// all environments
app.set('port', process.env.PORT || 3000);
app.set('views', __dirname + '/views');
app.set('view engine', 'jade');
app.use(morgan('dev'));
app.use(bodyParser());
app.use(methodOverride());
app.use(express.static(path.join(__dirname, '')));
// serve index and view partials
app.get('/', routes.index);
//Partials
app.get('/partials/:name', routes.partials);
// redirect all others
app.get('*', routes.all);
http.createServer(app).listen(app.get('port'), function () {
console.log('Express server listening on port ' + app.get('port'));
});
这是你的路线文件:
var fs = require('fs');
var path = require('path');
exports.index = function(req, res){
res.render('index');
};
exports.partials = function (req, res) {
var name = req.params.name;
res.render('partials/' + name);
};
exports.all = function (req, res) {
var name = req.params[0];
fs.exists(path+'/'+name, function(exists){
if(exists)
{
//console.log("file exists");
res.sendFile(path+'/'+name);
}else{
//console.log("file does not exist");
//redirects to index
res.render('index');
}
});
};
//////////////////////////
希望有帮助!