1. 程式人生 > >造輪子:搭建一個簡單的nodejs伺服器,從零開始搭建一個自用網站(0)

造輪子:搭建一個簡單的nodejs伺服器,從零開始搭建一個自用網站(0)

伺服器用的是阿里雲最早期的伺服器低配版本1Gcpu,512M記憶體,20G硬碟,1M頻寬,平常只是用來做測試,目前只處理業務邏輯,網站的設計上儘量避免佔用太多的頻寬,
靜態檔案的儲存用的是阿里雲oss,100G空間,夠放視訊,圖片什麼的,
html/js/css檔案用的是阿里雲的雲虛擬機器,目前200M空間,月流量5個G,幾塊錢的東西反正放著也是浪費,就先利用起來過期了再換到oss上
資料庫用的是家裡內網穿透出來的伺服器,各種安全防護做足,資料才是最重要的,嘿嘿
人就是這麼折騰。前端頁面只考慮最新谷歌瀏覽器,其他免談

目前只是一個簡單的基礎框架,接下來慢慢的完善功能,目前需要做的是:

  1. 日誌,
  2. 即時聊天,
  3. 線上視訊下載,
  4. 線上視訊播放,
  5. 技術文章分享,
  6. 前端仿桌面UI功能,
  7. 研究單頁應用的模組化開發

用到的檔案:

  1. main.js //啟動檔案
  2. get.js //post請求處理檔案,目前只返回html頁面
  3. post.js //post請求處理檔案及post介面
  4. socketIO.js //socket檔案及socket介面
  5. dataApi.js //mongodb連線池檔案及資料處理介面,全域性開放,需要在模組中引用
  6. index.js //首頁
//main.js檔案
require('./socketIO')(require('http').createServer(createServer).listen(3000
)); const GET = require('./get'); const POST = require('./post'); function createServer(req,res){ switch (req.method){ case "GET":GET(req,res); break; case "POST":POST(req,res);break; } }
//get.js檔案
var fs = require('fs');
module.exports= function (req,res) {
  fs.readFile('./www/index.html'
,function(error,data){ res.writeHead(200,{'Content-Type':'text/html'}); res.end(data,'utf-8'); }); };
//post.js 檔案
const dataAPI = require('./dataAPI');
const co=require('co');
const url = require('url');
const querystring=require('querystring');

var postAPI={
    new: function (v,callback) {
        const that=this;
        return  that[v]= function (req,res) {
            var arr = [];
            req.on("data",function(data){
                arr.push(data);
            });
            req.on("end",function(){
                var arg={
                    pathname:url.parse(req.url, true).pathname.slice(1),
                    query:JSON.parse(Buffer.concat(arr).toString())  ,
                    ret:function(ret) {
                        res.writeHead(200, { 'Content-Type': 'text/plain;charset=utf-8' });
                        res.write(ret);
                        res.end(null);
                    }
                };
                return co(callback(arg));
            })
        }
    }
};

module.exports= function (req,res) {
    var pathname=url.parse(req.url, true).pathname.slice(1);
    if(pathname!='req'||'res'||'new'){
        if(postAPI[pathname] instanceof Function){
            postAPI[pathname](req,res);
        }else{
            console.log(pathname,'不是函式或介面錯誤');
        }
    }
};

postAPI.new("aaa", function *(arg) {
    var  redata= yield dataAPI.api({"textID" : "596da54ef708180c436d4128"});
    arg.ret(JSON.stringify({query:arg.query,data:redata}));
});
//socketIO.js檔案
const dataAPI = require('./dataAPI');
const co=require('co');
module.exports= function (server) {
  var io = require('socket.io').listen(server);
  io.sockets.on('connect',function(socket){
    socket.on("aa", function (data,callback) {
      console.log(data);
      co(function *() {
        var  redata= yield dataAPI.api({"textID" : "596da54ef708180c436d4128"});
        callback(redata);
      });
    });
  });
};
dataAPI.js檔案
var co=require('co');
const MongoClient = require('mongodb').MongoClient;
var urla = 'mongodb://@127.0.0.1:27017/abc';
var dataAPI={};

MongoClient.connect(urla,function(err, client) {//連線池,避免連線數上限限制
  if(err){
    console.log("MongoClient.connect錯誤:",err);
  }
  dataAPI.client=client;
});

dataAPI.new= function (v,callback) {
  return  dataAPI[v]= function () {
    var arg=arguments;
   return co( callback(dataAPI.client,arg));
  }
};

dataAPI.new("api", function *(client,arg) {
    var data0 = client.collection('copyText');
    var redata=yield data0.find(arg[0]).toArray();
  console.log('資料介面列印',redata);
  return redata;
});

module.exports= dataAPI;
index.html檔案
<html>
<head>
    <meta charset="utf-8" />
    <script type="text/javascript">
        var ajax={
            XMLHttp : new XMLHttpRequest(),
            postJSON: function (json,callback) {
                var that=this.XMLHttp;
                that.open('POST',json.api,true);
                that.setRequestHeader('Content-type','application/json; charset=utf-8');
                that.onreadystatechange = function () {
                    if (that.readyState==4&&that.status==200) {
                        callback(that.responseText)
                    }
                };
                that.send(JSON.stringify(json.data));
            }
        };

    </script>
</head>
<body>
<input type="button"  onclick="aaa()" value="觸發socket介面">
<input type="button"  onclick="bbb()" value="觸發ajaxPOST介面">
<div id="dd"></div>
</body>
<script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/2.0.3/socket.io.js"></script>
<script>
    var socket = io.connect('ws://127.0.0.1:3000/');
    function aaa(){
        socket.emit('aa',{a:1}, function (data) {
            document.getElementById("dd").innerHTML+='<li>'+JSON.stringify(data)+'</li>'
        });
    }
    function bbb(){
        ajax.postJSON({api:'aaa',data:{a:1,b:2,c:3}}, function (data) {
            console.log(data);
        });
    }
</script>
</html>