Node.js(基础知识二)
通俗地理解,路由是你的请求中所指定需要的数据或者操作的响应封装吧。
我们需要为路由提供请求的URL和其他需要的GET及POST参数,然后路由则可以根据你所提供的数据进行相关的操作,比如说返回对应的数据,比如操作数据库等。使用路由也要引进url和querystring模块,这2个模块里封装的方法便于解析url和里面所设计的参数。
eg:
url.parse(urlString).query
|
url.parse(urlString).pathname |
| |
| |
------ -------------------
http://localhost:8888/start?foo=bar&hello=world
--- -----
| |
| |
querystring.parse(queryString)["foo"] |
|
querystring.parse(queryString)["hello"]
url.pase(urlString).query所获得的字符串传递给querystring.parse()方法,便可以进一步获得具体的附带数据。
当服务器接受到一个请求时,会调用回调函数onRequest(request,response),下面是一个route和server整合的例子。
eg:
//router.js
function route(pathname){
//pathname是通过调用方使用url模块得到后传递过来的
// ... 这里通过判断pathname进行对应的数据库操作或者指定返回的response
}
exports.route = route;
//server.js
var http = require("http");
var url = require("url");
function start(route){
function onRequest(request, response){
var pathname = url.parse(request.url).pathname;
route(pathname);
response.writeHead(200, {"Content-Type":"text/plain"});
response.write("Hello World");
response.end();
}
http.createServer(onRequest).listen(8888);
}
//index.js,用于绑定上面2者
var server = require("./server");
var router = require("./router");
server.start(router.route);
JavaScript中有一个特殊的对象,称为全局对象,及其所有属性都可以在程序的任何地方访问,即全局变量。
在浏览器JavaScript中,通常window是全局对象,而Node.js中的全局对象时global,所有全局变量都是global对象的属性,即global最根本的作用是作为全局变量的宿主。
比如setTimeout(cb,ms),console,process,_filename等。
util是Node.js核心模块,提供常用函数的集合,用于弥补核心JavaScript的功能。
util.inherits(constructor,superConstructor)是一个实习对象间 原型继承 的函数。
JavaScript的面相对象特性是基于原型的,通过原型复制来实现。
eg:
var util = require('util');
function Base(){
this.name = 'base';
this.base = 1991;
this.sayHello = function(){
console.log('Hello' + this.name);
};
}
Base.prototype.showName = function(){
console.log(this.name);
};
function Sub(){
this.name = 'sub';
}
util.inherits(Sub,Base);
var objBase = new Base();
objBase.showName();
objBase.sayHello();
console.log(objBase);
var objSub = new Sub();
objSub.showName();
console.log(objSub);
打印结果为:
base
Hello base
{ name: 'base', base: 1991, sayHello: [Function]}
sub
{ name: 'sub' }
Sub仅仅继承了Base在原型中定义的函数,但是在Base中使用原型定义的函数不会被作为对象的属性被输出。
将对象转换为字符串。util.inspect(object,[showHidden],[depth],[colors]),第二个参数为true时会比较详细,depth默认是2层。
Node.js文件系统模块中的方法均有异步和同步版本,一般多使用异步版本。
异步方法的最后一个参数一定为回调函数,回调函数的第一个参数包含了错误信息。
eg:
var fs = require("fs");
// 异步读取
fs.readFile('input.txt', function (err, data) {
if (err) {
return console.error(err);
}
console.log("异步读取: " + data.toString());
});
// 同步读取
var data = fs.readFileSync('input.txt');
console.log("同步读取: " + data.toString());
有关文件系统的更多方法属性可以查看这里