一个 Node.js 文件就是一个模块,这个文件可能是JavaScript 代码、JSON 或者编译过的C/C++ 扩展。
1、创建hello.js
exports.world = function() {
console.log('Hello World');
}
exports 是模块公开的接口,在此例中,world是对外看到的方法名,也就是接口。
2、引入模块
var hello = require('./hello');
hello.world();
在之前的笔记中提到过,和引入node.js本身的模块不同,引入自己书写的模块时,不能只写文件名称,需表明路径,此例表示引入当前目录下的hello.js文件。默认后缀为js,所以文件名中可以省略。
如果想把一个对象封装到模块中:
function Hello() {
var name;
this.setName = function(thyName) {
name = thyName;
};
this.sayHello = function() {
console.log('Hello ' + name);
};
};
module.exports = Hello;
再另一个文件中,直接获取对象:
var Hello = require('./hello');
hello = new Hello();
hello.setName('BYVoid');
hello.sayHello();
模块接口从exports.world = function(){} 变成了 module.exports = Hello
在外部引用该模块时,其接口对象就是要输出的 Hello 对象本身,而不是原先的 exports。
require方法接受以下几种参数的传递:
优先级关系:
在JavaScript中,一个函数可以作为另一个函数接收一个参数。我们可以先定义一个函数,然后传递,也可以在传递参数的地方直接定义函数。Node.js中函数的使用与Javascript类似。
var http = require("http");
http.createServer(function(request, response) {
response.writeHead(200, {"Content-Type": "text/plain"});
response.write("Hello World");
response.end();
}).listen(8888);
var http = require("http");
function onRequest(request, response) {
response.writeHead(200, {"Content-Type": "text/plain"});
response.write("Hello World");
response.end();
}
http.createServer(onRequest).listen(8888);
第一段代码向 createServer 函数传递了一个匿名函数。第二段代码则是先定义一个函数,然后传递。
提供请求的URL和其他需要的GET及POST参数,随后路由需要根据这些数据来执行相应的代码。
需要的所有数据都会包含在request对象中,该对象作为onRequest()回调函数的第一个参数传递。但是为了解析这些数据,我们需要额外的Node.JS模块,分别是url和querystring模块。
url.parse(string).query
|
url.parse(string).pathname |
| |
| |
------ -------------------
http://localhost:8888/start?foo=bar&hello=world
--- -----
| |
| |
querystring(string)["foo"] |
|
querystring(string)["hello"]
function route(pathname) {
console.log("About to route a request for " + pathname);
}
exports.route = route;
输出route作为接口。
var http = require("http");
var url = require("url");
function start(route) {
function onRequest(request, response) {
var pathname = url.parse(request.url).pathname;
console.log("Request for " + pathname + " received.");
route(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;
输出start作为接口。上段代码中的route方法作为start方法的参数,并在其中调用。url.parse(request.url).pathname用来获取路径名称。
var server = require("./server");
var router = require("./router");
server.start(router.route);
引入自己编写的server和router模块。调用start方法,并将route方法作为参数传递。
在命令行输入 node index.js 启动应用。随后请求一个URL,浏览器访问http://localhost(或127.0.0.1):8888(你监听的端口号)/(任意路径名)
// 输出到终端
process.stdout.write("Hello World!" + "\n");
// 通过参数读取
process.argv.forEach(function(val, index, array) {
console.log(index + ': ' + val);
});
// 获取执行路局
console.log(process.execPath);
// 平台信息
console.log(process.platform);
首先通过标准输出流进行了打印。argv 属性返回一个数组,由命令行执行脚本时的各个参数组成。它的第一个成员总是node,第二个成员是脚本文件名,其余成员是脚本文件的参数。后面两个参数则是Node的路径和平台系统。
process还有很多有用的方法和属性。
// 输出当前目录
console.log('当前目录: ' + process.cwd());
// 输出当前版本
console.log('当前版本: ' + process.version);
// 输出内存使用情况
console.log(process.memoryUsage());
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();
//objSub.sayHello();
console.log(objSub);
Sub继承Base,Base有三个在构造函数内定义的属性和一个原型中定义的函数。Sub 仅仅继承了Base 在原型中定义的函数。
输出为:
base
Hello base
{ name: 'base', base: 1991, sayHello: [Function] }
sub
{ name: 'sub' }
自己加油加油 笨鸟后飞也要飞呀飞