当前位置: 首页 > 面试题库 >

Express 4,NodeJS,AngularJS路由

毛正浩
2023-03-14
问题内容

我正在使用Express
4在我的后端托管AngularJS应用,而Nginx作为前端服务器。但是html5模式似乎不起作用,因为当我尝试http://localhost/login通过浏览器输入页面链接(例如)时,我将收到Cannot
/ GET错误。我需要为Express / Nginx做任何路由配置吗?这是我的配置代码:

快递4:

var express = require('express'),
    app = express(),
    server = require('http').Server(app),
    bodyParser = require('body-parser'),
    db = require('./db'),
    io = require('./sockets').listen(server),
    apiRoutes = require('./routes/api'),
    webRoutes = require('./routes/web');

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({
  extended: true
}));
app.use('/api', apiRoutes);
app.use(express.static(__dirname + '/public'));

server.listen(3000, function() {
  console.log('Listening on port %d', server.address().port);
});

AngularJS:

'use strict';
var nodeApp = angular.module('nodeApp',['ngRoute']);

nodeApp.config(function($routeProvider, $locationProvider, $controllerProvider) {
  $routeProvider.when('/', {
    templateUrl: 'partials/home.html'
  }).when('/login', {
    templateUrl: 'partials/login.html'
  });
  $locationProvider.html5Mode(true);

  nodeApp.controllerProvider = $controllerProvider;
});

Nginx:

# the IP(s) on which your server is running
upstream test-app {
  server 127.0.0.1:3000;
}

# the nginx server instance
server {
  listen 0.0.0.0:80;
  server_name test-app.cloudapp.net;
  access_log /var/log/nginx/test-app.log;

  # pass the request to the nodejs server with correct headers
  location / {
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_set_header X-Nginx-Proxy true;

    proxy_pass http://test-app/;
    proxy_redirect off;
  }
}

问题答案:

我假设您使用的是“单页”角度应用程序,因此一个使用ng-view加载所有其他部分的html页面。

在这种情况下,您需要执行以下操作:

快递4:

var express = require('express'),
    app = express(),
    server = require('http').Server(app),
    bodyParser = require('body-parser'),
    db = require('./db'),
    io = require('./sockets').listen(server),
    apiRoutes = require('./routes/api'),
    webRoutes = require('./routes/web');

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({
  extended: true
}));
app.use('/api', apiRoutes);
app.use(express.static(__dirname + '/public'));
// Here's the new code:
app.use('/*', function(req, res){
  res.sendfile(__dirname + '/public/index.html');
});

server.listen(3000, function() {
  console.log('Listening on port %d', server.address().port);
});

您面临的问题是,即使在触发路由之前已为“ / login”设置了路由,也需要加载它们。因此,服务器尝试找到无法返回404的路由“
/登录”的匹配项。对于单页角度应用,在路由中使用的所有路由都必须被路由捕获,app.get('/*', ...在这种情况下,然后返回主要的angular.js
html页面。请注意,这是最后一次调用,因此将在最后一次求值,如果将其放在最前面,则它将阻止所有后续规则运行,因为express只会为遇到的第一个规则运行处理程序



 类似资料:
  • 主要内容:AngularJS 实例,路由设置对象,AngularJS 实例本章节我们将为大家介绍 AngularJS 路由。 AngularJS 路由允许我们通过不同的 URL 访问不同的内容。 通过 AngularJS 可以实现多视图的单页 Web 应用(single page web application,SPA)。 通常我们的 URL 形式为 http://xnip.cn/first/page,但在单页 Web 应用中 AngularJS 通过 #! + 标记

  • 我尝试了以下示例:从Express.js中删除所有头,在Express node.js中禁用etag头,以及https://github.com/expressjs/Express/issues/2472,但不幸的是,它们没有解决我的问题。在Firefox、Opera和Chrome中,当开发者工具打开并禁用缓存时,或者当我在浏览器上线后第一次启动应用程序时,我的应用程序都能正常工作。我知道这与缓存

  • 问题内容: 我目前有一个内置路由的AngularJS应用程序。它可以正常工作,并且一切正常。 我的app.js文件如下所示: 我的应用程序内置了CMS,您可以在其中复制 / pages 目录中的新html文件并添加新的html文件。 即使对于新动态添加的文件,我仍然希望通过路由提供程序。 在理想的情况下,路由模式为: $ routeProvider.when(’/ pagename ‘,{temp

  • 问题内容: 由于某种原因,每当我尝试将一些数据发布到api服务器时,都会出现以下两个错误。 这是我的客户端有角JS代码,试图发送一些简单数据。该代码当前正在位于以下位置的Nginx服务器上运行 这是我的节点JS代码,用于处理“处理”请求 问题答案: 如错误消息所述,您必须在对预检的响应中确认Content-Type标头。这可能是由于您的请求的非“简单” Content- Type(表面上是appl

  • 我刚开始在Node.js应用程序中学习Express4.0,我发现它生成了文件,在该文件上只编写了应用服务器和端口设置,其他所有东西(如中间件和路由)都在文件中定义。 但是,我不确定这个是做什么的。我使用过Express3.x,并且始终在相同的文件上定义服务器和端口设置以及路由和中间件,并使用启动我的node应用程序。那么使用有什么意义呢?它是否只是将服务器和端口定义与其他分开? 现在,当我使用e

  • 本文向大家介绍NodeJS和AngularJS之间的区别,包括了NodeJS和AngularJS之间的区别的使用技巧和注意事项,需要的朋友参考一下 如今,NodeJ和AngularJ都已广泛用于应用程序开发。两者之间存在显着差异。 以下是NodeJS和AngularJS之间的重要区别。 序号 键 节点JS AngularJS 1 类型 NodeJs基本上是跨平台的运行时环境,这是用JavaScri