昵称被喵掉了

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

初识node.js

1.新建Hello.js 输入以下代码:

console.log("Hello World");

 

  • 运行:在 cmd 控制台使用 node 命令 运行
  • 得到效果如下:

 

 2.构建一个基础服务器

  • 新建server.js输入以下代码:
var http = require("http");//获取http模块赋值给http变量

http.createServer(function(request, response){
  console.log("Request received.");
  response.writeHead(200, {"Content-Type": "text/plain"});//设置响应
  response.write("Hello World");
  response.end();
}).listen(8888);//监听端口号

 

  • 运行,然后在浏览器中输入地址:http://locathost:8888/
  • 得到效果如下:

 

 

正确的是输出一个“Request received.”,上示图例中之所以出现了两次,是因为谷歌浏览器除了请求了http://locathost:8888/,还请求了http://localhost:8888/favicon.ico,证据如下:

 

 3.使用函数进行传递

  • node.js的特色之一,能够传递函数用它的名字把一个函数作为变量传递。但是我们不一定要绕这个“先定义,再传递”的圈子,我们可以直接在另一个函数的括号中定义和传递这个函数。
  • 新建newServer.js输入以下代码:
var http = require("http");

function onRequest(request,response){
  console.log("Request received.");   
  response.writeHead(200, {"Content-Type": "text/plain"});//设置响应
  response.write("Hello World");   response.end();
}
http.createServer(onRequest).listen(8888);

 

以上是对server.js的改造

事实上,可以用下面这个例子来说明不同之处在哪里:

function say(value){
  console.log(value);
}
function execute(fun,value){
  fun(value);
}
execute(say,"ok");

 

从以上示例可以看出,node.js能够用函数名将一个函数传递

 4.区分执行顺序

以下代码:

var http = require("http");
function onRequest(request, response) {
        console.log("Request received.");
        response.writeHead(200, {"Content-Type": "text/plain"});
        response.write("Hello World");
        response.end();
}
http.createServer(onRequest).listen(8888);
console.log("Request has received.");

 

会得到以下输出:

原因是当执行 node 命令时,9行代码执行输出,而3行代码值有在监听到8888端口时,才会被执行。(省略去烦人的favicon.ico输出)

5.node.js的模块化

  • 我们把我们的服务器脚本放到一个叫做 start 的函数里,然后我们会导出这个函数。

代码如下:

server.js

var http = require("http");

function start() {
  function onRequest(request, response) {
    console.log("Request received.");
    response.writeHead(200, {"Content-Type": "text/plain"});
    response.write("Hello World");
    response.end();
  }

  http.createServer(onRequest).listen(8888);
  console.log("Server has started.");
}
//exports.start是输出名为start的方法,赋值号右边的start是上边的函数名。
exports.start = start;

 

使用模块的方法:

 

var server = require("./server");//使用相对路径,加载server模块

server.start();//调用模块的对应方法

 

  1. 区分不同的url,执行不同的代码
  • 新建一个模块requestHandlers,内含对应不同的url有不同的方法,代码如下:
function start() {
  console.log("Request handler 'start' was called.");
}

function upload() {
  console.log("Request handler 'upload' was called.");
}

exports.start = start;
exports.upload = upload;

 

  • 在主文件里引用,并且将requestHandlers的方法赋予给一个对象
var server = require("./server");
var router = require("./router");
var requestHandlers = require("./requestHandlers");

var handle = {}
handle["/"] = requestHandlers.start;
handle["/start"] = requestHandlers.start;
handle["/upload"] = requestHandlers.upload;

server.start(router.route, handle);

 

  • 相应的我们的服务器模块server需要处理额外的信息——url对象
var http = require("http");
var url = require("url");//引用url模块

function start(route, handle) {
  function onRequest(request, response) {
    //将请求中的url字符串转换成url对象之后获取pathname赋值给变量
    var pathname = url.parse(request.url).pathname;
    console.log("Request for " + pathname + " received.");
    //将获取到的pathname交给route处理
    route(handle, pathname);

    response.writeHead(200, {"Content-Type": "text/plain"});
    response.write("Hello World");
    response.end();
  }

  http.createServer(onRequest).listen(8888);
  console.log("Server has started.");
}

exports.start = start;

 

  • route模块
function route(handle, pathname) {
  console.log("About to route a request for " + pathname);
  if (typeof handle[pathname] === 'function') {
    handle[pathname]();
  } else {
    console.log("No request handler found for " + pathname);
  }
}

exports.route = route;

 

posted on 2018-03-08 10:03  昵称被喵掉了  阅读(259)  评论(0)    收藏  举报