Nodejs基本架构

学习总结之用,方便以后调整

目录

├── app.js
├── bin
│   └── env.js
├── handle.js
├── public
├── README.md
├── routes
│   ├── handles
│   │   ├── instruction.js
│   │   ├── login.js
│   │   ├── quit.js
│   │   └── systemList.js
│   └── routes.js
├── system.json
└── views

bin: 服务器目录
public: 静态文件,如前端页面
routes: 路由文件
views: 页面文件
app.js: 入口文件
handles.js: 请求类型以及路由处理函数

代码实现

app.js导出一个httpServer对象,用于创建服务器

const handle = require('./handle').handle;
const routeHandle = require('./handle').routeHandle;

let app = function(req, res) {
    res.setHeader('Access-Control-Allow-Origin', '*');
    res.setHeader('Access-Control-Allow-Headers', '*');

    handle(req, params => {
        routeHandle(req, res, params);
    })
}

module.exports = app;

bin/env引入app并且创建服务器,这里简单创建服务器并监听9090端口.后面可以添加各种配置

const http = require('http');
const app = require('../app');

http.createServer(app).listen(9090);

handle.js定义了app.js所调用的函数,用于处理不同的请求方式以及对应的路由处理

const url = require('url');
const querystring = require('querystring');
const routerList = require('./routes/list');

function handle(req, cb) {
    let data = '';

    req.on('err', err => {
        return console.error(err);
    }).on('data', chunk => {
        data += chunk;
    }).on('end', () => {
        requestHandle(req, data, cb);
    })
}

function requestHandle(req, data, cb) {
    switch(req.method){
        case 'GET':
            let query = url.parse(req.url, true).query;

            cb(query);

            break;

        case 'POST':
            if(data.length > 1e6){
                return req.connection.destory();
            }

            let params = querystring.parse(data);

            cb(params);

            break;

        default:
            break;
    }
}

function routeHandle(req, res, params) {
    let pathname = url.parse(req.url, true).pathname,
        routerItem = routerList.isRouter(pathname);

    if (routerItem) {
        return routerList.list[routerItem](res, pathname, params, req.method);
    }
}

module.exports = {
    handle,
    routeHandle
}

routes文件包含routes.js以及handle文件夹,handle文件夹中的文件名为要处理的路由名.
routes.js具体实现:

class List{
    '/'(res) {
        res.end('hello');
    }
}

const routerAttrList = Object.getOwnPropertyNames(List.prototype);

function isRouter(pathname) {
    return routerAttrList.find((item, index) => {

        if(pathname === item || pathname.startsWith(item) && (item !== '/')){
            return item;
        }else{
            return false;
        }
    })
}

module.exports = {
    isRouter,
    routerAttrList,
    list: new List()
}

你可能感兴趣的:(Nodejs基本架构)