我有一个在端口 3000 上运行的 Node 服务器来服务 api 请求。

这很好用...

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

这不是。

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

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

这是我的服务器 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')); 
    }); 
 
} 

请您参考如下方法:

您的代码仅启动一个 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 提供一个单独的服务器。


评论关闭
IT源码网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!