xiaokeqi / i-learned

1 stars 0 forks source link

7天学会nodejs-day1 #37

Open xiaokeqi opened 4 years ago

xiaokeqi commented 4 years ago

nodejs基础

监听443、80端口需加root权限

在linux下,运行node服务时,若要监听443和80端口,需要使用root权限,否则报错。有两种使用方法如下:

  1. 服务前加sudo

sudo node server.js

  1. 使用chmod +s使nodejs总是以root权限运行,但不太安全
$ sudo chmod +s /usr/local/bin/node

sudo chmod +s /usr/local/bin/node

模块

在编写每个模块时,都有requireexportsmodule三个预先定义好的变量可供使用

require:用于在当前模块中加载和使用别的模块,传入一个模块名(路径),返回一个导出对象

var foo1 = require('./foo');

exports:当前模块的导出对象,用于导出模块的公有方法和属性。

exports.hello = function () {
    console.log('Hello World!');
};

module:替换当前模块的导出对象,指定一个默认导出对象

module.exports = function () {
    console.log('Hello World!');
};

模块默认导出对象被替换为一个函数

需要注意的是:由于exports导出对象被重写,因此只能导出被重写的默认对象。不能再导出其他属性和方法。如

module.exports = function(){
    console.log('default');
}
exports.sub = function() {
    console.log('sub')
}

此时通过

const sub = require('sub.js');
console.log(sub.sub) // 无任何返回,因为此时sub是function,如下
module.exports = function(){
    console.log('default');
}

注意:一个模块中的JS代码仅在模块第一次被使用时执行一次,并在执行过程中初始化模块的导出对象。然后缓存起来,之后,缓存起来的导出对象被重复利用。

Counter.js文件如下:

var i = 0;

function count() {
    return ++i;
}

exports.count = count;

main.js文件如下:

主模块main.js内容如下:

var counter1 = require('./util/counter');
var    counter2 = require('./util/counter');

console.log(counter1.count());
console.log(counter2.count());
console.log(counter2.count());

执行main.js

node main.js
1
2
3

可以看到,counter.js并没有因为require了两次,而初始化两次