简体   繁体   中英

MEAN: NodeJS serving Angular node_modules returns index.html

NodeJS https server running an api, cms and angular app. When I start the server on my local machine (macOS Sierra) using nodemon everything works fine. When I try to do the same on my VPS everything fails. Some details about the VPS: it uses NGINX as a proxy server and pm2 as the cluster manager, and letsencrypt for ssl.

Even by allowing the direct port of the node server in the firewall, to bypass NGINX, the angular frontend and CMS don't load correctly. Switching from pm2 to nodemon changes nothing.

Using the console I get this error message for every dependency needed from the public node_modules:

 Refused to execute script from 'https://mydomain/node_modules/jquery/dist/jquery.min.js' because  
 its MIME type ('text/html') is not executable, and strict MIME typechecking is enabled.

When we see what is actually returned its the index.html from angular instead of the requested package. For testing purposes I allowed the following

 app.use('/node_modules', express.static(__dirname + '/node_modules'));
//With a copy of jquery and bootstrap

and the CMS loaded correctly but the angular front-end doesn't. But it also exposes the server dependencies. Could you maybe help me spot my mistake?

The api is a simple REST API communicating with the MongoDB using some services. The CMS is served by Node using the ejs view engine

 //APP.JS
  let cms = require('./routes/cms'); //An Express Router
  let api = require('./routes/api');//An Express Router
 //The modules containing angular, jquery and bootstrap for the Angular front end and the cms
 //We separated the dependencies for the backend and frontend as a security measure
  app.use('/node_modules', express.static(__dirname + '/public/node_modules')); 
  app.use('/api', api); //Server the api
  app.use('/cms', cms); //Serve the cms
 //The problem is probably here
  app.use('/', express.static(__dirname + '/public')); //Route to the angular frontend
  app.get('/*', function(req, res){ //Support for html5Mode in Angular
        res.sendFile(path.join(__dirname + '/public/index.html'));
 });
 // catch 404 and forward to error handler
  app.use(function (req, res, next) {
        let err = new Error('Not Found\t' + req.header('Referer'));
        err.status = 404;
        next(err);
 });

 //Server.JS
 let options = {
        key: fs.readFileSync('certs/privatekey.pem'),
        cert: fs.readFileSync('certs/certificate.pem')
 };
 let server = https.createServer(options,app);

 //Angular Frontend index.html

  <head>
     <!— … —>    
        <link rel="stylesheet"   href="node_modules/bootstrap/dist/css/bootstrap.min.css">
     <link rel="stylesheet" href="node_modules/font-awesome/css/font-awesome.min.css">
     <link rel="stylesheet" href="node_modules/animate.css/animate.min.css">
     <link rel="stylesheet" href="node_modules/ng-dialog/css/ngDialog.min.css">
     <link rel="stylesheet" href="node_modules/ng-dialog/css/ngDialog-theme-default.min.css">
     <link rel="stylesheet" href="node_modules/angular-moment-picker/dist/angular-moment-picker.css">
     <link rel="stylesheet" href="node_modules/angular-tooltips/dist/angular-tooltips.min.css">
     <link rel="stylesheet" href="dist/css/site.css">
    <!— … —>
  </head>


 //The tree

  ├── api.md    //Some doc
  ├── app.js 
  ├── bin       //Contains server.js
  ├── certs
  ├── config
  ├── coverage
  ├── data      
  ├── database  //Link with the database
  ├── errors
  ├── helpers
  ├── logs
  ├── minigames
  ├── node_modules  //The dependencies for the server
  ├── package.json  //The package for the server
  ├── public        
  │ ├── app     //The controllers for the Angular app
  │ ├── app.js
  │ ├── assets
  │ ├── dist
  │ ├── img
  │ ├── index.html  //Entry point for the Angular app
  │ ├── karma.config.js
  │ ├── node_modules    //The node_modules for the Angular app
  │ ├── npm-debug.log
  │ ├── package.json    //The package for the Angular app
  │ ├── scss
  │ ├── stylesheets
  │ ├── superstatic.json
  │ ├── tests
  │ └── views   
  ├── routes        //Contains the routes for the Api and the CMS
  ├── services  
  ├── test
  ├── tools
  └── views     //The views for the CMS

It seems public/node_modules is empty. npm install seemed to work as it didn't throw an error, but it failed somewhere. Copying the node_modules over sftp resolved my issue.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM