NodeJs 上手

Flchy 于 2017-10-14 发布

开发环境

去官网 https://nodejs.org/en/download/ 载windows系统的安装包,直接安装就行了,内置npm,自动配置环境变量

使用VS Code作为开发工具

使用VS Code打开项目文件夹,选择 调试-添加配置 添加nodejs的运行配置

配置如下

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Run app.js",
            "type": "node",
            "request": "launch",
            // 主文件
            "program": "${workspaceFolder}/app.js"
        }
    ]
}

在app.js内写入 console.log('Hello World')

Ctrl+F5 非调试启动

控制台输出如下,表示一切运行ok

node app.js 
Hello World

其实在控制台直接node app.js效果是一样的

模块

模块的名字就是文件名(去掉.js后缀)

模块之间是隔离的,它们内部各自使用的变量名和函数名都互不冲突

通过exports把模块的功能暴露出去,供外部调用

module.exports = func/obj/var;

或者

exports.hello = hello;
exports.greet = greet;

//等价于
exports = {}
exports.hello = hello;
exports.greet = greet;
module.exports = exports

在别的模块中通过require来引用别的模块类似于Java的import

Node会依次在内置模块、全局模块和当前模块下查找

这样就可以使用别的模块中exports的功能

// 不要忘了写相对目录,后面不需要要加.js
var stringUtils = require('./string-utils');

基本模块

Demo:基于http模块的网络请求

var http = require('http');

http.get("http://baidu.com", function (req, res) {
    var html = '';
    req.on('data', function (data) {
        html += data;
    });
    req.on('end', function () {
        console.info(html);
    });
});

安装模块

NodeJs 使用npm作为包管理器

如果项目目录下有package.json,使用npm install命令会自动安装文件中指定的的模块,同时自动安装依赖的模块,所安装的模块会放在项目目录/node_modules里面

#安装到项目里面
npm install module-name

#安装到全局
npm install module-name -g

Demo: mysql 模块的使用

npm install mysql 不要全局安装,不然无法找到mysql模块

var mysql = require('mysql');

var connection = mysql.createConnection({
    host: 'localhost',
    user: 'root',
    password: '123456',
    port: '3306',
    database: 'food',
});

var  sql = 'SELECT * FROM myfile';

connection.query(sql,function (err, result) {
    if(err){
      console.log('[SELECT ERROR] - ',err.message);
      return;
    }
    for(var i=0;i<result.length;i++){
        console.log(result[i].name);
    } 
});

自定义模块

Demo: 对http模块中的server进行封装

app.js

var http = require('./myserver');

http.config({
    'index': ['index.html'],
    'port': 8888,
    'root': 'public'
}).start();

myserver.js

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

//默认配置
var config = {
    'port': 6666,
    'index': ['index.html', 'default.html'],
    'root': 'public'
};

var server;

var api = {
    config: function (conf) {
        for (var key in conf) {
            if (conf.hasOwnProperty(key)) {
                config[key] = conf[key];
            }
        }
        server = http.createServer(function (request, response) {
            requestUrl = url.parse(request.url);
            var rootPath = path.join(path.resolve('.'), config.root);
            var pathName = requestUrl.pathname;

            function render(path) {
                response.writeHead(200);
                fs.createReadStream(path).pipe(response);
            }

            function render404() {
                response.writeHead(404);
                response.end('404 Not Found');
            }

            if (pathName[pathName.length - 1] === '/') {
                for (var i = 0; i < config.index.length; i++) {
                    if (fs.existsSync(rootPath + pathName + config.index[i])) {
                        render(rootPath + pathName + config.index[i]);
                        return;
                    }
                }
                render404();
            } else {
                if (fs.existsSync(rootPath + pathName)) {
                    render(rootPath + pathName);
                } else {
                    render404();
                }
            }
            var basePath = path.join(path.resolve('.'), config.root);

        });
        return this;
    },
    start: function () {
        server.listen(config.port);
        console.info('Server start at ' + config.port);
    }
};

module.exports = api;