我知道还有其他答案,但他们似乎有警告。
This one causes a redirect,这对我使用Mixpanel的前端应用程序来说可能是致命的,而双重加载的Mixpanel会在浏览器中出现最大调用堆栈大小错误。
This one uses sendFile
我个人无法上班。试图诊断,我建议使用express.static()
。
目前我的代码如下:
home.js - 一些路线,最后一个路线是前端站点。
var indexPath = path.resolve( __dirname, '../' + process.env.PUBLIC_FOLDER )
router.get( '/:user/:stream/:slug', function( req, res, next ) {
if ( req.headers['user-agent'].indexOf( 'facebook' ) != -1 ) {
// stuff to handle the Facebook crawler
} else return next()
})
router.get( '/*', function( req, res ) {
express.static( indexPath )
})
server.js - 配置node / express
app = express();
app
.use( morgan( 'dev' ) )
.use(bodyParser.urlencoded( { limit: '50mb', extended: true } ) )
.use( bodyParser.json( { limit: '50mb' } ) )
.use( '/api', require('./routes/usersRoute.js') )
.use( '/', require( './routes/home' ) )
.on( 'error', function( error ){
console.log( "Error: " + hostNames[i] + "\n" + error.message )
console.log( error.stack )
})
http
.createServer( app ).listen( process.env.PORT )
.on( 'error', function( error ){
console.log( "Error: " + hostNames[i] + "\n" + error.message )
console.log( error.stack )
})
更多信息
您可以看到我尝试使用express.static()
的原因是因为当我使用res.sendfile()
时,我遇到问题like this one,其中控制台显示Unexpected token '<'
。不幸的是,答案并没有指定一个确切的解决方案,提问者也没有说他们解决了问题,但没有分享答案。
在我的试验和错误中,我添加了一些表达,比如
.use( '/app/app.js', express.static( indexPath + '/app/app.js' ) )
.use( '/app/views', express.static( indexPath + '/app/views' ) )
.use( '/app/controllers', express.static( indexPath + '/app/views' ) )
.use( '/app/directives', express.static( indexPath + '/app/views' ) )
.use( '/app/vendor', express.static( indexPath + '/app/vendor' ) )
.use( '/js', express.static( indexPath + '/js' ) )
.use( '/css', express.static( indexPath + '/css' ) )
.use( '/fonts', express.static( indexPath + '/fonts' ) )
.use( '/images', express.static( indexPath + '/images' ) )
.use( '/api', require('./routes/usersRoute.js') )
.all( '/*', require( './routes/home' ) )
在我的home.js
路线文件中添加了此
router.get( '/*', function ( req, res ) {
res.status( 200 ).set( { 'content-type': 'text/html; charset=utf-8' } )
.sendfile( indexPath + '/index.html' )
})
在浏览器中,我可以看到我的所有文件都在加载,但上面有<
错误。当我进行刷新时,我看到这个/*/
路由被调用了数百次,所以我认为.use( '...', ... )
配置被忽略了。
以下是Jonas要求的另一个例子。
var indexPath = path.resolve( __dirname, process.env.PUBLIC_FOLDER )
mongoose.connect( process.env.MONGOLAB_URI )
app = express();
app
.use( morgan( 'dev' ) )
.use(bodyParser.urlencoded( { limit: '50mb', extended: true } ) )
.use( bodyParser.json( { limit: '50mb' } ) )
.use( '/api', require('./routes/usersRoute.js') )
.use( '/', require( './routes/home.js' ) )
.use( express.static( indexPath ) )
.on( 'error', function( error ){
console.log( "Error: " + hostNames[i] + "\n" + error.message )
console.log( error.stack )
})
我在没有.use( '/', require( './routes/home.js' ) )
行的情况下也做了同样的事情来尝试缩小任何问题,但结果却相同。如果我在网址中有#
,则会加载该页面,但浏览器会删除#
(到目前为止一直很好)。但是如果我按下刷新,或手动输入网址,sans-hashbang,就会出现Cannot GET /home/splash
之类的错误,其中/home/splash
是我要去的路径。
答案 0 :(得分:12)
您可能以错误的方式使用快速中间件。查看documentation告诉我例如以下代码
.use( '/images', express.static( indexPath + '/images' ) )
使用此类网址提供文件夹indexPath + '/images'
下的任何文件:
http://localhost:3000/images/kitten.jpg
http://localhost:3000/images/logo.png
http://localhost:3000/images/whatever.jpg
这是你期望它做的吗?
我的建议是从
改变.use( '/', require( './routes/home' ) )
到
.use(express.static( indexPath ))
因为根据文档,它将根据根路径indexPath
文件夹下的所有静态文件提供服务。没有前缀。
我认为这就是我迄今为止所提供的输入所能提供的帮助。如果这不起作用,也许你可以分享一些我可以用来自己重现它的小代码示例。
确定。我试图创建一个简单的例子。我通过以下方式使其工作。 我的目录结构如下:
|- index.js
|- public/
|---- index.html
|---- test.html
|---- main.js
|---- angular.js
|---- angular-route.js
index.js
是节点服务器。请注意路由的顺序。我还添加了一些/home/login
示例,以明确如何添加不应通过角度的其他服务器路由。
var http = require('http');
var express = require('express');
var app = express();
app
.use(express.static('public'))
.get('/home/login', function (req, res) {
console.log('Login request');
res.status(200).send('Login from server.');
})
.all('/*', function ( req, res ) {
console.log('All');
res
.status( 200 )
.set( { 'content-type': 'text/html; charset=utf-8' } )
.sendfile('public/index.html' );
})
.on( 'error', function( error ){
console.log( "Error: \n" + error.message );
console.log( error.stack );
});
http
.createServer( app ).listen( 8080 )
.on( 'error', function( error ){
console.log( "Error: \n" + error.message );
console.log( error.stack );
});
console.log('Serving app on port 8080');
index.html
非常简单。
<!doctype html>
<html>
<head>
<title>Angular HTML5 express test</title>
<script type="text/javascript" src="angular.js"></script>
<script type="text/javascript" src="angular-route.js"></script>
<script type="text/javascript" src="main.js">
</script>
</head>
<body ng-app="app">
<div ng-view></div>
</body>
</html>
main.html
只是添加了一些内容。重要的是指向/test
<div>
<h1>This is just a {{val}}</h1>
<button ng-click="clicked()">Click me!</button>
<span>You clicked {{counter}} times</span>
<a href="/test">test me!</a>
</div>
test.html
实际上是不相关的
<div>
<h4>What a beautiful day to test HTML5</h4>
</div>
main.js
正在进行核心角色html5工作
angular.module('app', ['ngRoute'])
.config(function($locationProvider) {
$locationProvider
.html5Mode({
enabled: true, // set HTML5 mode
requireBase: false // I removed this to keep it simple, but you can set your own base url
});
})
.config(function($routeProvider) {
$routeProvider
.when('/test', {templateUrl: 'test.html', controller: function() {
console.log('On /test.');
}})
.when('/', {templateUrl: 'main.html', controller: 'MyTestCtrl'})
.otherwise('/');
})
.controller('MyTestCtrl', function ($scope) {
self = $scope;
self.val = 'TeSt';
self.counter = 0;
var self = self;
self.clicked = function() {
self.counter++;
};
});
答案 1 :(得分:5)
而不是:
router.get( '/*', function( req, res ) {
express.static( indexPath )
})
做
router.get( '/:anyreq', function( req, res ) {
express.static( indexPath )
})
将它保留在路径文件的末尾。
答案 2 :(得分:0)
您的AJAX请求似乎有问题 我通常会设置这样的路线:
app.use(express.static(path.join(__dirname, "./public")));
app.use("/", require(path.join(__dirname, "./routes")));
并在前端拨打电话
指令中的templateUrl: "/templates/home.html"
或$http.get("/images").success(...).error(...)
使用$ http。
在templateUrl的情况下,应用程序将进入公共目录,然后是路径模板并提供html文件。
在$ http的情况下,我指定一个路由,以便应用程序检查公共目录,不会看到图像路径,因此转移到路由器。在路由器我有一个
router.get("/images", function (req, res, next) { res.sendFile(...);
或res.send({(data)}) })
将我需要的文件发送回前端,在成功处理程序中捕获该文件。