【问题标题】:api route not working over httpsapi 路由无法通过 https
【发布时间】:2018-03-25 19:24:30
【问题描述】:

我有一个节点服务器在端口 3000 上运行来服务 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 和 HTTPS?你真的应该在 80 上运行 HTTP,在 443 上运行 HTTPS。
  • 说真的,您希望我们如何在不显示您的代码的情况下帮助您?您不能在同一端口上同时运行 http 服务器和 https 服务器。每个都需要自己的端口。所以端口 3000 将是一个或另一个,而不是两者。
  • 您是否在您的 api 上运行 https 服务器?即你的代码中是否有类似https.createServer() 的东西。如果是这样,它在侦听哪个端口?
  • UI 运行在 Ubuntu 16 Linux 服务器上。 http 和 https 加载正常。我为 80 和 443 设置了 2 个虚拟主机。
  • 我将很快发布我的节点服务器文件。 (在会议中)目前

标签: node.js linux express


【解决方案1】:

您的代码仅启动 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 使用单独的服务器。

【讨论】:

    【解决方案2】:

    使用 var https = require("https");不是

    Var http = require ("http");

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-10
      • 2019-10-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多