2017-10-13 83 views
-4

我有一個運行在端口3000上的節點服務器來服務api請求。api路由不工作通過https

這工作得很好...

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')); 
    }); 

} 
+0

你將需要顯示你的節點代碼,否則這只是一個瘋狂的猜測。也許你有兩個不同的應用程序部署,一個與路線,一個沒有?另外你如何在同一個端口上同時使用HTTP和HTTPS?你真的應該在80上運行HTTP,在443上運行HTTPS。 – tadman

+0

嚴重的是,你如何期待我們在不顯示代碼的情況下幫助你?您不能在同一端口上運行http服務器和https服務器。每個都需要自己的端口。所以3000端口將是一個或另一個,而不是兩個。 – jfriend00

+0

你在api上運行https服務器嗎?你是否在你的代碼中有'https.createServer()'這樣的東西。如果是這樣,它在監聽什麼端口? –

回答

0

你的代碼只啓動一個HTTP服務器訪問中間件。此行:

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

只啓動一個http服務器。如果您需要支持HTTPS,則還必須啓動HTTPS服務器,並且必須在其他端口上啓動它。該express doc for app.listen()告訴您如何做到這一點,它的basicaly這樣的:

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分別提供服務器。

0

使用var https = require(「https」);不是

var http = require(「http」);