目录
所有第三方中间件都可以在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路径
使用:
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);
});
}
});
});
});