剧场模式
首页后端Nodejs轻松学 nodejs - 基础篇

轻松学 Node.js - 基础篇 #14 web 服务器 part 6 重构路由代码

海外散仙厉飞雨 · 真仙发布于

注意:

404页面这个部分不对,它的状态码应该是 404,而不是 200(疏忽之处,请各位看官自行修正)

app.js

var server = require('./server');
var router = require('./router');
var handler = require('./handler');

var handle = {};
handle["/"] = handler.home;
handle['/home'] = handler.home;
handle['/review'] = handler.review;
handle['/api/v1/records'] = handler.api_records;

server.startServer(router.route, handle);

server.js

var http = require('http');
var fs = require('fs');

function startServer(route, handle) {
    var onRequest = function(request, response) {
        console.log('Request received ' + request.url);
        route(handle, request.url, response);
    }

    var server = http.createServer(onRequest);

    server.listen(3000, '127.0.0.1');
    console.log('Server started on localhost port 3000');
}

module.exports.startServer = startServer;

router.js

var fs = require('fs');

function route(handle, pathname, response) {
    console.log('Routing a request for ' + pathname);
    if (typeof handle[pathname] === 'function') {
        handle[pathname](response);
    } else {
        response.writeHead(200, { 'Content-Type': 'text/html' });
        fs.createReadStream(__dirname + '/404.html', 'utf8').pipe(response);
    }
}

module.exports.route = route;

handler.js

var fs = require('fs');

function home(response) {
    response.writeHead(200, { 'Content-Type': 'text/html' });
    fs.createReadStream(__dirname + '/index.html', 'utf8').pipe(response);
}

function review(response) {
    response.writeHead(200, { 'Content-Type': 'text/html' });
    fs.createReadStream(__dirname + '/review.html', 'utf8').pipe(response);
}

function api_records(response) {
    response.writeHead(200, { 'Content-Type': 'application/json' });
    var jsonObj = {
        name: "hfpp2012"
    };
    response.end(JSON.stringify(jsonObj));
}

module.exports = {
    home: home,
    review: review,
    api_records: api_records
}
20 条回复
  • JimmyWang · 真仙
    JimmyWang · 真仙 #1

    感谢你的视频,请问;
    请问你视频收到的每个请求为什么没有favicon?我的如下
    receive request/api/catstring
    request path name is /api/catstring
    receive request/favicon.ico
    request path name is /favicon.ico

  • 海外散仙厉飞雨 · 真仙

    不用管它,可以忽略,那个是浏览器自己加上的

  • WangJefy · 真仙
    WangJefy · 真仙 #3

    力挺随风!

  • 海外散仙厉飞雨 · 真仙

    多谢

  • ahong · 真仙
    ahong · 真仙 #5

    其实没搞懂为啥要分出handler这个模块

  • 海外散仙厉飞雨 · 真仙

    应该是为了更好的组织代码,代码维护性上来说的

  • ahong · 真仙
    ahong · 真仙 #7

    好吧,谢谢

  • dingjian33 · 真仙
    dingjian33 · 真仙 #8

    typeof handle[pathname] === 'function' 这段不怎么理解 后面的‘function’什么意思

  • 海外散仙厉飞雨 · 真仙

    typeof 是查看它的类型,你可以打印出来看看。

  • dingjian33 · 真仙
    dingjian33 · 真仙 #10

    好的 谢谢

  • linzehong · 金仙后期

    这个可以理解为动态路由吗?

  • 海外散仙厉飞雨 · 真仙

    还不能哦

  • rongyi2233 · 真仙
    rongyi2233 · 真仙 #13

    您好,为什么不在server.js里面直接require到handle,
    而是要在app.js里面引入,再传给server呢?

  • 海外散仙厉飞雨 · 真仙

    为了组织代码,也是为了体验一些 web 框架的原理

  • 960269915 · 真仙
    960269915 · 真仙 #15

    专门注册账号来感谢老师的教学视频。但是老师有个错误,node会请求favicon.ico这个图标,所有路由会执行2次,导致第二次为undefined。需要加个判断
    if (req.url != '/favicon.ico') {
    route(handle, req.url, res);
    }
    不足之处请老师多多指教

  • 海外散仙厉飞雨 · 真仙

    好的,多谢

  • SkyCrystal · 真仙
    SkyCrystal · 真仙 #17

    看的有点久,不过最后理解透彻了,代码敲不到一点注释倒是一堆

  • xue250023 · 真仙
    xue250023 · 真仙 #18

    var http=require('http');
    var fs=require('fs');
    //fs.readFile('b.text',function(err,data){
    //filetext=data
    //console.log(data);
    //})

    //fs.writeFile('//创建的名称','//要写入的东西','.//完毕之后要做的事情')
    http.createServer(function (request, response) {

    // 发送 HTTP 头部 
    // HTTP 状态值: 200 : OK
    // 内容类型: text/plain
    response.writeHead(200, {'Content-Type': 'text/plain'});
    // 发送响应数据 "Hello World
    var file_name=request.url.slice(1)
    

    // var file_name='.'+request.url
    fs.readFile(file_name,function(err,data){
    filetextt=data
    console.log('123')
    console.log(data)
    response.write(data)
    response.end();
    })

    }).listen(8888);

    // 终端打印如下信息
    console.log('Server running at http://127.0.0.1:8888/');

  • 韦威 · 太乙玉仙
    韦威 · 太乙玉仙 #19

    感觉耦合性好强,但是感觉还是有一定的好处的,我们写代码应该趋向于这种风格吗?

  • 海外散仙厉飞雨 · 真仙

    就是多学学吧,怎么适合,怎么来,多学代码,以后就自然能体会到的

© 汕尾市求知科技有限公司 | 粤ICP备19038915号 | 在线学员:98

Top