api路由无法通过https工作

时间:2017-10-13 15:48:02

标签: node.js linux express

我在端口3000上运行节点服务器来提供api请求。

这很好......

http://www.skoolaide.com:3000/api/accounts

这不是。

https://www.skoolaide.com:3000/api/accounts

有人可以告诉我为什么吗?如果你转到https://www.skoolaide.com,ssl证书配置正确,但我是否需要在节点端做一些事情?

这是我的服务器js文件。请注意:只在端口3000上运行中间件(api)。出于某种原因,我无法通过https访问中间件......

    'use strict';
var express = require('express');
var router = express.Router();
var app = express();
var http = require('http');
var open = require('open');
var cors = require('cors');
var path = require('path');
var morgan = require('morgan');
var errorhandler = require('errorhandler');
var bodyParser = require('body-parser');
var mongoose = require('mongoose');
var config = require('./config/config');
var jwt = require('jsonwebtoken');
var compression = require('compression');
var runMiddleware = require('run-middleware')(app);
var fs = require('fs');
var readline = require('readline');
var google = require('googleapis');
var googleAuth = require('google-auth-library');
var multer = require('multer');
var node_xj = require("xls-to-json");
var moment = require('moment');
var async = require('async');
var btoa = require('btoa');
var sharp = require('sharp');
var students = require("./middleware/students.api");
var accounts = require("./middleware/accounts.api");
var messages = require("./middleware/messages.api");
var advocates = require("./middleware/advocates.api");
var authenticate = require("./middleware/authenticate.api");
var email = require("./middleware/email.api");
var text = require("./middleware/text.api");
var colleges = require("./middleware/colleges.api");
var amazon = require("./middleware/amazon.api");
var rewards = require("./middleware/rewards.api");
var files = require("./middleware/files.api");
var validations = require("./middleware/validations.api");
var points = require("./middleware/points.api");
var notifications = require("./middleware/notifications.api");
var notificationsMap = require("./middleware/notificationsMap.api");
var trivia = require("./middleware/trivia.api");
var tasks = require("./middleware/rewardgoals.api");
var classes = require("./middleware/classes.api");
var connections = require("./middleware/connections.api");
var badges = require("./middleware/badges.api");
var fixpasswords = require("./middleware/fixpasswords.api");
var Files = require('./models/files');




mongoose.connect(config.database);

process.on('SIGINT', function() {
  mongoose.connection.close(function () {
    console.log('Mongoose disconnected on app termination');
    process.exit(0);
  });
});


// use body parser so we can get info from POST and/or URL parameters
app.use(bodyParser.json({
  limit: '50mb'
}));
app.use(bodyParser.urlencoded({
  limit: '50mb',
  extended: true
}));

app.set('uploads', path.join(__dirname, 'uploads'));
app.get("/uploads/*", function (req, res, next) {
  res.sendFile(__dirname + req.url);
});
var whitelist = ['https://www.skoolaide.com', 'https://skoolaide.com'];
var corsOptionsDelegate = function (req, callback) {
  var corsOptions;
  if (whitelist.indexOf(req.headers['origin']) !== -1) {
    corsOptions = { origin: true, credentials: true } // reflect (enable) the requested origin in the CORS response 
  } else {
    corsOptions = { origin: false, credentials: false } // disable CORS for this request 
  }
  callback(null, corsOptions) // callback expects two parameters: error and options 
}
app.use(cors(corsOptionsDelegate));
//this is used because the body parser removes undefined values from the database.
app.set('json replacer', function (key, value) {
  // undefined values are set to `null`
  if (typeof value === "undefined") {
    return null;
  }
  return value;
});


app.use(multer({
  dest: './uploads/',
  rename: function (fieldname, filename) {
    return filename.replace(/\W+/g, '-').toLowerCase() + Date.now()
  },
  onFileUploadStart: function (file) {
    //console.log(file.fieldname + ' is starting ...')
  },
  onFileUploadData: function (file, data) {
    //console.log(data.length + ' of ' + file.fieldname + ' arrived')
  },
  onFileUploadComplete: function (file) {
    //console.log(file.fieldname + ' uploaded to  ' + file.path)
  }
}).any());

// "files" should be the same name as what's coming from the field name on the client side.
app.post("/api/upload", function (req, res) {
  //console.log(req.files[0].mimetype)


  fs.readFile(req.files[0].path, function (err, data) {

    var newPath = __dirname + "/uploads/" + req.headers["account_id"] + '_' + moment().format('MM_DD_YYYY_HH-mm-ss') + '_' + req.files[0].originalname.replace(/[^a-zA-Z0-9.]/g, '_');
        var readPath = "/uploads/" + req.headers["account_id"] + '_' + moment().format('MM_DD_YYYY_HH-mm-ss') + '_' + req.files[0].originalname.replace(/[^a-zA-Z0-9.]/g, '_');


    if(req.files[0].mimetype.indexOf('image') > -1){
          sharp(data)
            .rotate()
            .resize(800, 800)
            .max()
            .toFile(newPath, function(err, info){

              var file = new Files();
              file.owner = req.headers.account_id || null;       
              file.classId = req.body.classId || null;
              file.rewardGoalId = req.body.rewardGoalId || null;
              file.avatarId = req.body.avatarId || null;
              file.mimeType = req.files[0].mimetype || null;
              file.originalName = req.files[0].originalname || null;
              file.path = readPath;

              file.save(function (err, newFile) {
                  if (err) {
                      res.send(err);
                  } else {
                      res.send({ success: true, data: newFile }).end();
                  }
              });    
            });  
    }  else{
      //not an image file...

       var newPath = __dirname + "/uploads/" + req.headers["account_id"] + '_' + moment().format('MM_DD_YYYY_HH-mm-ss') + '_' + req.files[0].originalname.replace(/[^a-zA-Z0-9.]/g, '_');
       //console.log('Writing file: ', newPath);
    fs.writeFile(newPath, data, function (err) {


        var readPath = "/uploads/" + req.headers["account_id"] + '_' + moment().format('MM_DD_YYYY_HH-mm-ss') + '_' + req.files[0].originalname.replace(/[^a-zA-Z0-9.]/g, '_');
        //console.log(readPath)

         var file = new Files();
         file.owner = req.headers.account_id || null;       
         file.classId = req.body.classId || null;
         file.rewardGoalId = req.body.rewardGoalId || null;
         file.profileId = req.body.profileId || null;
         file.mimeType = req.files[0].mimetype || null;
         file.originalName = req.files[0].originalname || null;
         file.path = readPath;

         file.save(function (err, newFile) {
             if (err) {
                 res.send(err);
             } else {
                 res.send({ success: true, data: newFile }).end();
             }
         });      
    });





    }
    });
  });

app.use(express.static('www'))
var a = ['/'];
//all get requests resolve to index.
app.get(a, function (req, res) {
  console.log('This is a test', req.originalUrl, req.url);
  res.setHeader('Cache-Control', 'private, no-cache, no-store, must-revalidate');
  res.setHeader('Expires', '-1');
  res.setHeader('Pragma', 'no-cache');
  res.setHeader('X-UA-Compatible', 'IE=Edge,chrome=1');
  res.setHeader('Judson', 'Rocks!');
  if (req.originalUrl == '/') {  
    res.sendFile('www/index.html', {root: __dirname});
  }
});

app.set("superSecret", config.secret)


//var upload = require("./middleware/upload.api");

app.use('/api', router);
app.use('/api/students', students);
app.use('/api/accounts', accounts);
app.use('/api/messages', messages);
app.use('/api/advocates', advocates);
app.use('/api/authenticate', authenticate);
app.use('/api/email', email);
app.use('/api/text', text);
app.use('/api/colleges', colleges);
app.use('/api/amazon', amazon);
app.use('/api/rewards', rewards);
app.use('/api/files', files);
app.use('/api/validate', validations);
app.use('/api/points', points);
app.use('/api/notifications', notifications);
app.use('/api/notificationsMap', notificationsMap);
app.use('/api/trivia', trivia);
app.use('/api/rewardgoals', tasks);
app.use('/api/classes', classes);
app.use('/api/badges', badges);
app.use('/api/connections', connections);
app.use('/api/fixpasswords', fixpasswords);


/**SERVER*************************************/
// all environments 
app.set('port', process.env.PORT || 3000);
app.engine('html', require('ejs').renderFile);
// express/connect middleware
app.use(morgan('dev'));




app.use(compression()); //use compression 

// development only
if ('development' === app.get('env')) {
  app.use(errorhandler());
}

/**END SERVER*************************************/

var cluster = require('cluster');

if (cluster.isMaster) {
  var numWorkers = require('os').cpus().length;

  console.log('Master cluster setting up ' + numWorkers + ' workers...');

  for (var i = 0; i < numWorkers; i++) {
    cluster.fork();
  }

  cluster.on('online', function (worker) {
    console.log('Worker ' + worker.process.pid + ' is online');
  });

  cluster.on('exit', function (worker, code, signal) {
    console.log('Worker ' + worker.process.pid + ' died with code: ' + code + ', and signal: ' + signal);
    console.log('Starting a new worker');
    cluster.fork();
  });
} else {

  app.listen(app.get('port'),
    function () {
      console.log('myApp server listening on port ' + app.get('port'));
    });

}

2 个答案:

答案 0 :(得分:0)

您的代码仅启动HTTP服务器。这一行:

app.listen(app.get('port'))

仅启动http服务器。如果要支持HTTPS,则还必须启动HTTPS服务器,并且必须在其他端口上启动它。 express doc for app.listen()告诉你如何做到这一点,它基本上是这样的:

var express = require('express');
var https = require('https');
var http = require('http');
var app = express();

http.createServer(app).listen(80);
https.createServer(options, app).listen(443);

其中options包含您的SSL证书,以及您为http服务器和https服务器填写所需端口号的位置。

如果您操作的假设是您在浏览器中不需要端口号以访问http和https服务器,那是因为浏览器会为您填写默认端口号。如果您只键入一个http URL,它将使用端口80.如果您键入没有端口的https URL,它将使用端口443.如果您不在这两个特定端口上,则必须在浏览器URL中指定所需的端口。在任何一种情况下,对于http和https,都需要在不同端口上使用单独的服务器。

答案 1 :(得分:0)

使用var https = require(&#34; https&#34;);不

Var http = require(&#34; http&#34;);