(一)node学习

目录

 

1、http、url模块

2、CommonJs

3、fs模块

4、静态web服务

5、回调和事件驱动

6.1、静态文件托管

6.2、路由、ejs、get、post

7、路由

8、MongoDB


所有第三方中间件都可以在npm官网查询到对应的下载和引用例子,这里有传送门

 

1、http、url模块

01、http模块:创建服务

// 引入http模块
var http = require('http')
// 通过http的createServer创建服务,参数是一个函数,函数参数包括一个request和一个response
http.createServer((req, res)=> {

    // 设置请求头
    res.writeHead(200, {'Content-Type': 'text/html;charset=utf-8'});

    res.write('你好 nodejs!')

    // 这里要终止请求,否则请求会一直存在
    res.end();

// 设置监听的端口
}).listen(8001)



// 访问:http://localhost:8001

02、url模块:解析请求的url,获取get数据

var http = require('http')
// 引入url模块
/*

三个常用方法(其实只有一个或两个)
(1)、url.parse(param1 [, param2]):解析地址信息,其中第一个参数是解析的地址,第二个参数表示将get信息转化成一个对象
例如:
url.parse('http://localhost:8002/?aid=123&cid=456'):
  Url {
      protocol: 'http:',
      slashes: true,
      auth: null,
      host: 'localhost:8002',
      port: '8002',
      hostname: 'localhost',
      hash: null,
      search: '?aid=123&cid=456',
      query: 'aid=123&cid=456',
      pathname: '/',
      path: '/?aid=123&cid=456',
      href: 'http://localhost:8002/?aid=123&cid=456' 
    }

url.parse('http://localhost:8002/?aid=123&cid=456', true):
  Url {
      protocol: 'http:',
      slashes: true,
      auth: null,
      host: 'localhost:8002',
      port: '8002',
      hostname: 'localhost',
      hash: null,
      search: '?aid=123&cid=456',
      query: [Object: null prototype] { aid: '123', cid: '456' },
      pathname: '/',
      path: '/?aid=123&cid=456',
      href: 'http://localhost:8002/?aid=123&cid=456' 
    }

(2)、url.format(param),与url.parse(),相反,通过一个对象,转成一个地址
(3)、url.resolve(param1, param2),其中第一个参数是地址,第二个参数是要替换的路径名,例如:
url.resolve("http://www.baidu.com/aa/bb", "login/index.html"):
'http://www.baidu.com/aa/login/index.html'

*这里注意,第二个参数是否需要加斜杆
url.resolve("http://www.baidu.com/aa/bb", "/login/index.html"):
'http://www.baidu.com/login/index.html'


*/
var url = require('url')
http.createServer((req, res) => {


    res.writeHead(200, {'Content-Type': 'text/html;charset=utf-8'});

    // 因为req.url会有多个,所以这里过滤一下
    if (req.url != '/favicon.ico') {
        var result = url.parse(req.url, true);
        console.log('aid = ' + result.query.aid)
        console.log('cid = ' + result.query.cid)
    }

    res.write('你好 nodejs!')

    res.end();
}).listen(8002)

03、每次修改代码时,都需要重启一下服务,这样很麻烦,可以通过supervisor,自动更新:

        安装:npm -g install supervisor

        使用:supervisor aaa.js

 

2、CommonJs

(1)、描述和定义:

CommonJS 规范的提出,主要是为了弥补当前 JavaScript 没有标准的缺陷。它的终极目标就是:提供一个类似 Python,Ruby 和 Java 语言的标准库,而不只是停留在小脚本程序的阶段。

CommonJS 就是模块化的标准,nodejs 就是 CommonJS(模块化)的实现。

规定:

1.我们可以把公共的功能抽离成为一个单独的 js 文件作为一个模块,默认情况下面这个模块里面的方法或者属性,外面是没法访问的。如果要让外部可以访问模块里面的方法或者属性,就必须在模块里面通过 exports 或者 module.exports 暴露属性或者方法。

2. 在需要使用这些模块的文件中,通过 require 的方式引入这个模块。这个时候就可以使用模块里面暴露的属性和方法。

(2)、模块暴露的两种方式:

// 方式一:在调用的地方拿到的是一个对象 => {str : '这是一个在 "02CommonJs" 目录下的模块'}
exports.str = str

// 方式二:在调用的地方拿到的是str等号右边的内容 => '这是一个在 "02CommonJs" 目录下的模块'
module.exports = str

(3)、模块引用及模块位置的四种方式:

// 引入自定义模块
// 1、与config模块同个目录下
var config = require('./config') // 这里.js可以省略
console.log(config)





// 2、在node_modules目录下创建nav模块,这里node_modules创建在和当前文件同级
// 这里路径是node_modules/nav.js
var nav = require('nav') // 默认的npm引入模块方式,在node_modules下查找
console.log(nav)





// 3、默认的npm引入模块方式,在node_modules下查找,如果带文件夹,则一层层找
// 这里路径是node_modules/foo/foo.js
var foo = require('foo/foo')
console.log(foo)






/**
   4、
 * bar在node_modules/bar/目录下,但是想通过直接require的方式引用,这个时候,在bar目录下执行:
 * npm init --yes // 这里如果报错,可能是项目或者项目路径的名称带有空格等特殊字符,这时候可以通过npm init来创建
 * 然后会在bar下生成一个package.json文件
 * 该文件的入口文件就是指向这个bar目录下的js文件
 */

var bar = require('bar')
console.log(bar)

// 在生成package.json文件后,不修改"main": "bar.js",的情况下输出是:"这是一个在 02CommonJs/node_modules/bar/" 目录下的bar模块

// 将"main": "bar.js"改为"main": "index.js",输出
"这是一个在 "02CommonJs/node_modules/bar/" 目录下的index模块"

 

 

3、fs模块

(1)、常用模块

/*
这些都是异步的
* 1、fs.stat:监测是文件还是目录
* 2、fs.mkdir:创建目录
* 3、fs.writeFile:创建并写入文件,如果文件已经存在,则覆盖写入
* 4、fs.appendFile:给文件追加内容
* 5、fs.readFile:读取文件
* 6、fs.readdir:读取目录下的所有文件和目录
* 7、fs.rename:重命名,作用:1、重新命名文件;2、剪切文件。第一个参数是目标文件,第二个是要重命名或者剪切到的文件位置
* 8、fs.rmdir:删除目录
* 8、fs.unlink:删除文件
* */

var fs = require('fs');

// fs.stat('03nodejs fs模块/html', (err, stats) => {
//     if (err) {
//         console.log(err);
//     } else {
//         console.log('文件:' + stats.isFile());
//         console.log('目录:' + stats.isDirectory());
//     }
// });

/*******************************华丽的分割线***********************************/

// fs.mkdir('03nodejs fs模块/html/js', err => {
//     if (err) {
//         console.log(err);
//     } else {
//         console.log('创建目录成功');
//     }
// });

/*******************************华丽的分割线***********************************/

/**
 * 第一个参数是创建或者写入的文件名,第二个参数是写入的数据
 * 第三个参数是一些可选选项,非必要,一般不需要用到,可以设置编码:encoding(String),mode(Number),flag(默认值)
 */
// fs.writeFile('03nodejs fs模块/t.txt', '这是写入的文件内容1111', err => {
//     if (err) {
//         console.log(err);
//     } else {
//         console.log('写入文件成功');
//     }
// });

/*******************************华丽的分割线***********************************/

// fs.appendFile('03nodejs fs模块/t.txt', '\n这是新写入的内容', err => {
//     if (err) {
//         console.log(err);
//     } else {
//         console.log('写入文件成功');
//     }
// });

/*******************************华丽的分割线***********************************/

// fs.readFile('03nodejs fs模块/t.txt', (err, data) => {
//     if (err) {
//         console.log(err);
//     } else {
//         console.log(data.toString());
//     }
// });

/*******************************华丽的分割线***********************************/

// fs.readdir('03nodejs fs模块/html', (err, data) => {
//     if (err) {
//         console.log(err);
//     } else {
//         console.log(data);
//     }
// });

/*******************************华丽的分割线***********************************/

// 1、重新命名文件
// fs.rename('03nodejs fs模块/html/style.css', '03nodejs fs模块/html/index.css', err => {
//     if (err) {
//         console.log(err);
//     } else {
//         console.log("重命名成功");
//     }
// });
// 2、剪切文件
// fs.rename('03nodejs fs模块/html/index.css', '03nodejs fs模块/html/css/index.css', err => {
//     if (err) {
//         console.log(err);
//     } else {
//         console.log("剪切成功");
//     }
// });

/*******************************华丽的分割线***********************************/

// fs.rmdir('03nodejs fs模块/a', err => {
//     if (err) {
//         console.log(err);
//     } else {
//         console.log("删除成功");
//     }
// });

/*******************************华丽的分割线***********************************/

// fs.unlink('03nodejs fs模块/t111.txt', err => {
//     if (err) {
//         console.log(err);
//     } else {
//         console.log("删除成功");
//     }
// });

(2)、两个应用

var fs = require('fs');


// 1、判断服务器上是否有upload目录,没有则创建,主要用在文件上传
// fs.stat('03nodejs fs模块/upload', (err, stats) => {
//     if (err) {
//         fs.mkdir('03nodejs fs模块/upload', error => {
//             if (error) {
//                 console.log(error);
//             } else {
//                 console.log('upload目录创建成功');
//             }
//         });
//     } else {
//         console.log('目录已存在');
//     }
// });


// 2、获取某个路径下的所有目录

dirList = [];
fs.readdir('03nodejs fs模块/html', (err, files) => {
    if (err) {
        console.log(err);
    } else {

        // 由于fs.stat是异步的,所以这里使用匿名函数来遍历
        (function getDir(i) {

            if (i == files.length) {
                console.log('目录:');
                console.log(dirList);
                return false;
            }

            fs.stat('03nodejs fs模块/html/' + files[i], (error, stats) => {
                if (stats.isDirectory()) {
                    dirList.push(files[i]);
                }
                getDir(i + 1);
            });

        })(0);

    }
});

(3)、readStream和writeStream,以及pipe

var fs = require('fs');

// 以流的方式读取数据

var readStream = fs.createReadStream('03nodejs fs模块/input.txt');

var str = '';
var count = 0;
// 监听读取
readStream.on('data', chunk => {
    str += chunk;
    count++;
});

// 监听读取完成
readStream.on('end', (chunk) => {
    console.log(str);
    console.log(count);
});

// 监听如果读取失败
readStream.on('error', err => {
    console.log('读取失败');
    console.log(err);
});



// 以流的方式写入数据,如果文件不存在,则自动创建

var writeStream = fs.createWriteStream('03nodejs fs模块/output.txt');

var data = '我是从数据库读取的数据\n';

// 写入文件
// writeStream.write(data, 'utf8');

for (let i = 0; i < 100; i++) {
    writeStream.write(data, 'utf8');
}

// 结束写入
writeStream.end();

// 结束写入时触发finish
writeStream.on('finish', () => {
    console.log('写入成功');
});

// 写入失败时
writeStream.on('error', err => {
    console.log('写入失败');
    console.log(err);
});




// 从一个文件读取的流数据,写入到另外一个文件

var readStream = fs.createReadStream('03nodejs fs模块/input.txt');

var writeStream = fs.createWriteStream('03nodejs fs模块/output.txt');

readStream.pipe(writeStream);

console.log('程序执行完毕');

 

4、静态web服务

目录结构:

(1)、01services1 读取静态文件到页面上.js

var http = require('http');

var fs = require('fs');

http.createServer((req, res) => {

    var pathname = req.url;

    if (pathname == '/') {
        pathname = '/index.html';
    }

    if (pathname != '/favicon.ico') { // 过滤请求

        fs.readFile('04nodejs 静态web服务/static' + pathname, (err, data) => {
            if (err) {
                console.log('文件不存在');

                fs.readFile('04nodejs 静态web服务/static/404.html', (error, data404) => {
                    // 请求头
                    res.writeHead(200, {'Content-Type': 'text/html;charset=utf8'});
                    res.write(data404);
                    // 请求结束
                    res.end();
                });

            } else {

                // 请求头
                res.writeHead(200, {'Content-Type': 'text/html;charset=utf8'});

                res.write(data);

                // 请求结束
                res.end();
            }
        });

    }

}).listen(8001);

(2)、02services2 根据请求的文件类型设置不同的请求头.js

// getmime.js
module.exports = function(extname) {

    switch (extname) {
        case '.html':
            return 'text/html';
        case '.css':
            return 'text/css';
        case '.js':
            return 'text/javascript';
        default:
            return 'text/html';
    }

};



var http = require('http');

var fs = require('fs');

// nodejs内置模块
var path = require('path');

// 自定义模块
var getMime = require('./model/getmime');

http.createServer((req, res) => {

    var pathname = req.url;

    if (pathname == '/') {
        pathname = '/index.html';
    }

    if (pathname != '/favicon.ico') { // 过滤请求

        fs.readFile('04nodejs 静态web服务/static' + pathname, (err, data) => {
            if (err) {
                console.log('文件不存在');

                fs.readFile('04nodejs 静态web服务/static/404.html', (error, data404) => {
                    // 请求头
                    res.writeHead(200, {'Content-Type': 'text/html;charset=utf8'});
                    res.write(data404);
                    // 请求结束
                    res.end();
                });

            } else {

                var extname = getMime(path.extname(pathname));

                // 请求头
                res.writeHead(200, {'Content-Type': extname + ';charset=utf8'});

                res.write(data);

                // 请求结束
                res.end();
            }
        });

    }

}).listen(8001);

(3)、03services3 过滤get请求数据,只拿路径下的文件.js

var http = require('http');

var fs = require('fs');

// nodejs内置模块
var path = require('path');

// 自定义模块
var getMime = require('./model/getmime');

var url = require('url');

http.createServer((req, res) => {

    var pathname = req.url;

    if (pathname == '/') {
        pathname = '/index.html';
    }

    /****

    02和03的区别:这里通过url.parse().pathname来获取路径

    ****/ 
    pathname = url.parse(pathname).pathname;
    console.log(pathname)

    if (pathname != '/favicon.ico') { // 过滤请求

        fs.readFile('04nodejs 静态web服务/static' + pathname, (err, data) => {
            if (err) {
                console.log('文件不存在');

                fs.readFile('04nodejs 静态web服务/static/404.html', (error, data404) => {
                    // 请求头
                    res.writeHead(200, {'Content-Type': 'text/html;charset=utf8'});
                    res.write(data404);
                    // 请求结束
                    res.end();
                });

            } else {

                var extname = getMime(path.extname(pathname));

                // 请求头
                res.writeHead(200, {'Content-Type': extname + ';charset=utf8'});

                res.write(data);

                // 请求结束
                res.end();
            }
        });

    }

}).listen(8001);

(4)、04services4 通过文件mimeJson的方式获取文件请求类型.js

mime.json是封装文件类型的一个json

// getmimefromfile.js
module.exports = function(fs, extname) {

    // 使用同步的方式获取文件内容
    var data = fs.readFileSync('04nodejs 静态web服务/mime.json');
    // 将buffer类型的data转成字符串,同时转成json格式
    var Mimes = JSON.parse(data.toString());
    return Mimes[extname];

};




var http = require('http');

var fs = require('fs');

// nodejs内置模块
var path = require('path');

// 自定义模块
var getMime = require('./model/getmimefromfile');

var url = require('url');

http.createServer((req, res) => {

    var pathname = req.url;

    if (pathname == '/') {
        pathname = '/index.html';
    }

    pathname = url.parse(pathname).pathname;
    console.log(pathname)

    if (pathname != '/favicon.ico') { // 过滤请求

        fs.readFile('04nodejs 静态web服务/static' + pathname, (err, data) => {
            if (err) {
                console.log('文件不存在');

                fs.readFile('04nodejs 静态web服务/static/404.html', (error, data404) => {
                    // 请求头
                    res.writeHead(200, {'Content-Type': 'text/html;charset=utf8'});
                    res.write(data404);
                    // 请求结束
                    res.end();
                });

            } else {

                var extname = getMime(fs, path.extname(pathname));

                // 请求头
                res.writeHead(200, {'Content-Type': extname + ';charset=utf8'});

                res.write(data);

                // 请求结束
                res.end();
            }
        });

    }

}).listen(8001);

 

5、回调和事件驱动

(注意:非阻塞io和阻塞io实际上就是指异步和同步)

(1)、回调

var fs = require('fs');

console.log(1);

var getMime = function(callback) {
    fs.readFile('05 nodejs回调和事件驱动/mime.json', (err, data) => {
        console.log(2);
        callback(data);
    });
};

getMime(function(result) {
    console.log(result.toString());
});

console.log(3);

(2)、事件驱动:用的是nodejs的内置模块events,通过事件广播,监听广播数据的方式,实现数据和业务的“同步”操作(实际上还是属于异步的,只是数据的获取方式问题)

var fs = require('fs');

// nodejs内置的事件模块
var events = require('events');
// 实例化EventEmitter对象
var EventEmitter = new events.EventEmitter();

// 监听to_parent广播过来的数据
EventEmitter.on('to_mime', (data) => {
    console.log(data);
});

// 监听to_parent广播过来的数据
EventEmitter.on('to_parent', (data) => {
    console.log(data);
    EventEmitter.emit('to_mime', '发送给to_mime数据');
});

// 两秒后广播数据,on事件监听到‘to_parent’有广播数据,则执行no事件
setTimeout(() => {

    EventEmitter.emit('to_parent', '发送的数据')

}, 2000);





/********
    事件驱动方式获取数据
*********/

EventEmitter.on('to_mime', (data) => {

    console.log(data.toString());

});

fs.readFile('05 nodejs回调和事件驱动/mime.json', (err, data) => {

    EventEmitter.emit('to_mime', data);

});

 

 

6.1、静态文件托管

实际上就是将http.createServer()中的内容,抽成一个模块中去,通过直接调用该模块的方式来实现静态文件托管。

 

 

6.2、路由、ejs、get、post

通过使用模板引擎ejs,来实现get和post数据到指定的模板文件(.ejs结尾,ejs文件实际上就是html文件,只是能够在node,通过<%%>等标签,获取、计算、判断、处理传递过来的数据)。

(1)、简单路由
 

var http = require('http');

var url = require('url');



http.createServer((req, res) => {

    var pathname = url.parse(req.url).pathname;

    if (pathname == '/index.html') {
        res.end('index.html');
    } else if (pathname == '/register.html') {
        res.end('register.html');
    } else {
        res.end('404.html');
    }

}).listen(8001);

(2)、ejs:npm install ejs --save

// login.ejs
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

        <h2>ejs是一个后台的模板殷勤——登录</h2>

        <h2><%=data%></h2>

        <ul>
            <% for (var i = 0; i < list.length; i++) { %>
                <li><%=list[i]%></li>
            <% } %>
        </ul>
</body>
</html>
var http = require('http');

var url = require('url');

/**
 * ejs是一个用于后台的模板引擎,主要通过获取数据库等请求或发送的数据,渲染到指定的模板页面中
 */
var ejs =  require('ejs');

http.createServer((req, res) => {

    var pathname = url.parse(req.url).pathname;
    console.log(pathname)

    if (pathname != '/favicon.ico') {
        if (pathname == '/login') {
            var data = '这是传输到页面的数据';
            var list = ['1111', '2222', '3333'];
            // 这里通过ejs.renderFile,读取模板文件,并将data数据传递过去,然后在callback中,将页面结构返回,
            // 最后通过response.end(data),将页面渲染到浏览器。
            ejs.renderFile('06 nodejs静态文件托管 get post ejs/view/login.ejs', {
                data: data,
                list: list
            }, (err, data) => {
                if (err) {
                    return false;
                }
                res.end(data);
            });

        } else if (pathname == '/register') {
            ejs.renderFile('06 nodejs静态文件托管 get post ejs/view/register.ejs', {}, (err, data) => {
                if (err) {
                    return false;
                }
                res.end(data);
            });
        } else {
            res.end('index');
        }
    }

}).listen(8001);

(3)、get、post

通过request.method获取数据提交的方式,从而决定用哪种方式获取数据并处理数据。

// login.ejs
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

    <h2>登录</h2>
    <form action="/dologin" method="POST">
        <input type="text" name="username">
        <br>
        <input type="password" name="password">
        <br>
        <input type="submit" value="提交">
    </form>

</body>
</html>
// dologin.ejs

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

    <h2>dologin</h2>

    <% if (method == 'get') { %>
        <h4>这是get方式传的参数</h4>
        <p><%= data %></p>
    <% } else if (method == 'post') { %>
        <h4>这是post方式传的参数</h4>
        <p><%= data %></p>
    <% } %>

</body>
</html>
var http = require('http');

var url = require('url');

/**
 * ejs是一个用于后台的模板引擎,主要通过获取数据库等请求或发送的数据,渲染到指定的模板页面中
 */
var ejs =  require('ejs');

http.createServer((req, res) => {

    var urlJson = url.parse(req.url, true),
        pathname = urlJson.pathname,
        method = req.method.toLowerCase(),
        search = urlJson.search;



    if (pathname != '/favicon.ico') {
        if (pathname == '/login') {
            ejs.renderFile('06 nodejs静态文件托管 get post ejs/view/login.ejs', {}, (err, data) => {
                if (err) {
                    return false;
                }
                res.end(data);
            });

        } else if (pathname == '/dologin') {

            if (method == 'get') {
                ejs.renderFile('06 nodejs静态文件托管 get post ejs/view/dologin.ejs', {
                    'method': method,
                    'data': search
                }, (err, data) => {
                    if (err) {
                        console.log(err);
                        return false;
                    }
                    res.end(data);
                });
            } else {
                var postData = '';
                req.on('data', function(chunk) {
                    postData += chunk;
                });
                req.on('end', function(err, chunk) {
                    console.log(postData);
                    ejs.renderFile('06 nodejs静态文件托管 get post ejs/view/dologin.ejs', {
                        'method': method,
                        'data': postData
                    }, (err, data) => {
                        if (err) {
                            console.log(err);
                            return false;
                        }
                        res.end(data);
                    });
                });
            }
        } else if (pathname == '/register') {
            ejs.renderFile('06 nodejs静态文件托管 get post ejs/view/register.ejs', {}, (err, data) => {
                if (err) {
                    return false;
                }
                res.end(data);
            });
        } else {
            res.end('index');
        }
    }

}).listen(8001);

 

7、路由

(1)、路由

// model.js模块,即路由



/**
 * ejs是一个用于后台的模板引擎,主要通过获取数据库等请求或发送的数据,渲染到指定的模板页面中
 */
var url = require('url');
var ejs =  require('ejs');
var app = {
    login : function(req, res) {
        ejs.renderFile('07 nodejs router ejs/view/login.ejs', {}, (err, data) => {
            if (err) {
                return false;
            }
            res.end(data);
        });
    },
    dologin: function(req, res) {
        var urlJson = url.parse(req.url, true),
            pathname = urlJson.pathname,
            method = req.method.toLowerCase(),
            search = urlJson.search;

        if (method == 'get') {
            ejs.renderFile('07 nodejs router ejs/view/dologin.ejs', {
                'method': method,
                'data': search
            }, (err, data) => {
                if (err) {
                    console.log(err);
                    return false;
                }
                res.end(data);
            });
        } else {
            var postData = '';
            req.on('data', function(chunk) {
                postData += chunk;
            });
            req.on('end', function(err, chunk) {
                console.log(postData);
                ejs.renderFile('07 nodejs router ejs/view/dologin.ejs', {
                    'method': method,
                    'data': postData
                }, (err, data) => {
                    if (err) {
                        console.log(err);
                        return false;
                    }
                    res.end(data);
                });
            });
        }
    },
    register: function(req, res) {
        ejs.renderFile('07 nodejs router ejs/view/register.ejs', {}, (err, data) => {
            if (err) {
                return false;
            }
            res.end(data);
        });
    },
    home: function(req, res) {
        ejs.renderFile('07 nodejs router ejs/view/index.ejs', {}, (err, data) => {
            if (err) {
                return false;
            }
            res.end(data);
        });
    }
};

module.exports = app;
var http = require('http');

var url = require('url');

var model = require('./model/model');

// 路由封装

http.createServer((req, res) => {

    var pathname = url.parse(req.url).pathname.replace('/', '');


    if (pathname != 'favicon.ico') {
        try {
            model[pathname](req, res);
        } catch (e) {
            model['home'](req, res);
        }
    }

}).listen(8001);

 

8、MongoDB

安装:cnpm install mongodb --save

启动服务:mongod --dbpath 存放data路径

(如何操作MongoDB)

使用:

var mongodb = require('mongodb');
// 引入mongodb下面的MongoClient
var MongoClient = mongodb.MongoClient;

// 定义数据库连接地址
var url = 'mongodb://localhost:27017/';
var dbName = 'shop';


// mongodb 4x版本,需要添加{useNewUrlParser:true}
MongoClient.connect(url , {useNewUrlParser:true}, (err, client) => {

    if (err) {
        console.log('数据库连接失败');
        return false;
    }
    let db = client.db(dbName);
    db.collection('user').insertOne({"name": "wangwu", "age": 26}, error => {
        if (error) {
            console.log('增加失败!');
            return false;
        }
        console.log('增加成功!');
        client.close(); // 关闭数据库
    });

});

增、改、删:


var http = require('http');
var ejs = require('ejs');
var app = require('./model/express_route');

var MongoClient = require('mongodb').MongoClient;
var dbUrl = 'mongodb://localhost:27017';
var dbName = 'shop';

var url = require('url');

http.createServer(app).listen(8001);

app.get('/', (req, res) => {
    var msg = '这是数据库的数据';
    ejs.renderFile('09 nodejs_mongodb/views/index.ejs', {msg: msg}, (err, data) => {
        res.send(data);
    });
});

// 新增
app.get('/add', (req, res) => {

    MongoClient.connect(dbUrl, {useNewUrlParser: true}, (err, client) => {

        if (err) {
            console.log('db connect fail');
            return false;
        }

        let db = client.db(dbName);

        db.collection('user').insertOne({
            "name": "python",
            "age": 22
        }, (error, data) => {
            if (error) {
                console.log('add fail');
                return false;
            }
            res.send('add success');
        });

    });
    
    client.close();

});

// 修改
app.get('/edit', (req, res) => {

    var parseUrl = url.parse(req.url, true);
    var query = parseUrl.query;
    var name = query.name;
    var age = query.age;

    MongoClient.connect(dbUrl, {useNewUrlParser: true}, (err, client) => {

        if (err) {
            console.log('db connect fail');
            return false;
        }

        let db = client.db(dbName);

        db.collection('user').updateOne({
            "name": name
        },{
            $set: {
                "age": age
            }
        }, (error, data) => {
            if (error) {
                console.log('update fail');
                return false;
            }
            res.send('update success');
        });

    });
    
    client.close();

});

// 删除
app.get('/delete', (req, res) => {

    var parseUrl = url.parse(req.url, true);
    var query = parseUrl.query,
        name = query.name;

    MongoClient.connect(dbUrl, {useNewUrlParser: true}, (err, client) => {

        if (err) {
            console.log('db connect fail');
            return false;
        }

        let db = client.db(dbName);

        db.collection('user').deleteOne({
            "name": name
        }, (error, data) => {
            if (error) {
                console.log('delete fail');
                return false;
            }
            res.send('delete success');
        })

    });
    
    client.close();

});

查:


var http = require('http');
var ejs = require('ejs');
var app = require('./model/express_route');

var MongoClient = require('mongodb').MongoClient;
var dbUrl = 'mongodb://localhost:27017';
var dbName = 'shop';

var url = require('url');

http.createServer(app).listen(8001);

// 查询数据并且通过ejs显示到页面
app.get('/', (req, res) => {

    MongoClient.connect(dbUrl, {useNewUrlParser: true}, (err, client) => {
        if (err) {
            console.log('db connect fail');
            return false;
        }

        let db = client.db(dbName);

        var result = db.collection('user').find({});

        var list = []; // 存储查询的数据

        result.forEach(doc => {
            list.push(doc);
        }, error => {
            if (error) {
                console.log(error);
            } else {
                ejs.renderFile('09 nodejs_mongodb/views/index.ejs', {list}, (ejsErr, data) => {
                    if (ejsErr) {
                        console.log(ejsErr);
                        return false;
                    }
                    res.send(data);
                });
            }
        });

    });

});

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

rising_chain

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值