学习就要记笔记,不是因为我容易忘记,是因为我想写哈哈哈哈哈哈哈哈哈。
一、学习了node,使用了express框架(express第三方依赖包)搭建了服务。
接收参数(使用了body-parser内置依赖包):
1.get:urlencoded形式,有着query和params两种形式,都是对象数据类型。
2.post:请求主体一般有urlencoded、formData和json三种数据形式。用着node的内置依赖包body-parser来处理。formData数据形式用bodyParser.urlencoded({extends:false})处理,extends键值为boolean值,表示数组等是否深解析,这个请求的请求头Content-Type要是application/x-www-form-urlencoded;json数据类型用bodyParser.json()处理,这个请求的请求头Content-Type要是application/json。这里使用的body-parser形式是所有的路由都设置,单独都某个路由配置我不是很了解在网上看到过但没试过。
3.put请求方式post请求方式类似,一般是用来做修改的。
4.delete请求方式与get请求方式类似,一般是用来做删除操作的。
二、path内置依赖包使用过的方法
1.resolve方法:用来方便设置绝对路径,如返回上一级等。不给参返回node执行的绝对地址;传一个参(路径字符串)返回传的路径地址;再传一个参可与相互操作返回操作后的路径地址。
2.extname方法:用来返回文件的拓展名,接收一个参(文件名)。
三、querystring内置依赖包使用过的方法
1.decode方法:别名prase,将要解析的字符串解析为对象。接参=> (str, 分隔符1, 分隔符2, options)
参一 str:解析的URL查询字符串;
参二 分隔符1:指定键值对之间的分隔符;
参三 分隔符2:指定键名与键值之间的分隔符;
参四 options:不是JavaScript的对象,一些Object原型上的方法不能用。
decodeURIComponent:指定使用编码格式的函数。默认querystring.unescape() UTF-8编码格式;
maxKeys:指定解析键的最大数量。指定为0时没有数量限制。默认值为1000。
2.encode方法:别名stringify,将对象转换为查询字符串,参数与decode方法类似。
四、fs内置依赖包:对文件进行操作的。
1.writeFile方法:写入文件,参一文件相对/绝对路径,参二为写入数据,如果不覆盖写入则参三为{flag: “a”},参四为回调函数(可接收一个参数错误信息);
2.readFile方法:读取文件,参一文件相对/绝对路径,参二可选使用编码格式,最后一个参为回调函数;
3.unlink方法:删除文件,参一文件相对/绝对路径,参二回调函数;
4.exists方法:判断文件是否存在,参一文件相对/绝对路径,参二回调函数;
5.rename方法:重命名文件,参一文件绝对路径,参二更改后的文件名(以绝对路径形式),参三回调函数;
6.copyFile方法:拷贝文件,参一被拷贝文件相对/绝对路径,参二目标文件相对/绝对路径,参三flags(数字),参四回调函数。我对这个拷贝文件不熟~
五、mongodb第三方依赖包,使用它来连接mongodb数据库。
先使用MongoClient方法的connect方法来连接数据库,参一为mongoURL字符串(“mongodb://127.0.0.1:27017”),参二加个对象({useUnifiedTopology: true}),参三为回调函数(两个参数,参一是错误信息,参二是连接成功返回的一个窗口)。
增删改查等都要选择窗口.db(数据库名).collcetion(集合名),下面就不写了。
查询方法:
1.查询多条:find方法,返回的数据要用toArray方法来转化成数组一下。
2.查询单条:findOne方法,参一位置对象,参二回调函数。
增加方法:
1.增加一条文档:insertOne方法,参一文档对象,参二回调函数。
2.增加多条文档:insertMany方法,参一多条文档组成的数组,参二回调函数。
删除方法:
1.删除一条文档:deleteOne方法,参一位置对象,参二回调函数。
2.删除多条文档:没尝试过嘻嘻嘻~
修改方法:$set 修改指定位置数据 $inc 增加/减少多少,加减运算
1.修改一条文档信息:updataOne方法,参一位置对象,参二更改对象,参三回调函数
2.修改多条文档信息:没尝试过嘻嘻嘻~
计算文档总条数:countDocuments方法,参一计算条件,要使用then方法来转化一下返回的数据(参数为数量)。
六、formidable第三方依赖包,我用来转换含有文件的formData数据,使用依赖包里面的IncomingForm构造函数。
const form = new formidable.IncomingForm();
1.encoding变量:选择编码格式;
2.uploadDir变量:选择文件上传路径;
3.keepExtensions变量:是否保留文件拓展名
4.parse方法:转换formData对象,参一为formData对象;参二为回调函数,回调函数的参一为错误信息,参二为非文件信息对象,参三为文件信息对象。
七、mysql第三方依赖包,使用它来连接操作mysql数据库
1.设置连接属性:mysql.createConnection(options),options是一个配置对象。
const db = mysql.createConnection({
host: "localhost",
user: "root",
password: "root",
database: dbName
});
2.连接mysql数据库:db.connect(),参一回调函数,成功的话db就是连接窗口了。
// 连接数据库
db.connect(err => {
if(err) reject("连接mysql数据库失败");
else resolve(db);
});
增删改查都是使用db.query(SQL语句,数组,回调函数)方法来操作的。参二的数组在SQL语句的赋值有多少问号数组中就有几个元素,没有使用问号就第二个参数不写。增删改查我都封装了一下,想尽可能避免使用SQL语句。
3.查询数据。
// 查询(数据库名,表名,控制对象) 查询到的数据以数组形式返回
// const control = {limit: 2, sort: "id asc", condition: "id='1'"};
// 注意:control可以不传,skip默认0,limit默认6,排序默认没有(不要就不传),查找条件默认没有
// 查找条件condition和sort排序都要以sql语句的格式来写(字符串)
async findDocuments(dbName, tableName, control={
}){
const {
skip=0, limit=6, sort, condition} = control;
const SORT = sort === undefined ? "" : `ORDER BY ${
sort}`; // 排序
const LIMIT = `LIMIT ${
skip},${
limit}`; // 限制
const WHERE = condition === undefined ? "": `WHERE ${
condition}`; // 条件
const findSQL = `SELECT * FROM ${
tableName} ${
WHERE} ${
SORT} ${
LIMIT}`;
console.log(findSQL);
const db = await _connect(dbName);
return new Promise((resolve, reject) => {
db.query(findSQL, (err, results) => {
if(err) reject({
ok: -1, message: "查找数据失败"});
else if(results.length > 0) resolve({
ok: 1, message: "查找数据成功", results});
else resolve({
ok: -1, message: "数据库中没找到该数据"});
});
});
}
4.插入数据。
// 插入数据(数据库名,表名,插入文档对象)
// const document = { id: 2, adminName: "ho", adminPwd: "hohoho" }
async insertDocument(dbName, tableName, document){
const rowStr = Object.keys(document).join(",");
const valuesStr = Object.values(document).map(item => "'"+item+"'").join(",");
const insertSQL = `INSERT INTO ${
tableName}(${
rowStr}) values(${
valuesStr})`;
console.log(insertSQL);
const db = await _connect(dbName);
return new Promise((resolve, reject) => {
db.query(insertSQL, (err, result) => {
if(err) reject({
ok: -1, message: "插入数据失败"});
else if(result.affectedRows > 0) resolve({
ok: 1, message: "插入数据成功"});
else resolve({
ok: -1, message: "表规则该条数据插入不进去"})
});
});
}
5.更新数据。
// 更新数据(数据库名,表名,位置对象,更新对象)
// const whereObj = {id: 1};
// const upObj = {id: 4};
async updateDocument(dbName, tableName, whereObj, upObj){
let WHERE = "WHERE "; // 在哪儿位置
let SET = "SET "; // 更新的数据
for(let key in whereObj)
WHERE += key + "='" + whereObj[key] + "'";
for(let key in upObj)
SET += key + "='" + upObj[key] + "'";
const updateSQL = `update ${
tableName} ${
SET} ${
WHERE}`;
const db = await _connect(dbName);
return new Promise((resolve, reject) => {
db.query(updateSQL, (err, result) => {
if(err) reject({
ok: -1, message: "更新数据失败"});
else if(result.affectedRows > 0) resolve({
ok: 1, message: "更新数据成功"});
else resolve({
ok: -1, message: "表中该条数据就是这样的"});
});
});
},
6.删除数据。
// 删除数据(数据库名,表名,位置对象)
// const whereObj = {id: 4};
async delDocument(dbName, tableName, whereObj){
let WHERE = "WHERE ";
for(let key in whereObj)
WHERE += key + "='" + whereObj[key] + "'";
const deleteSQL = `delete from ${
tableName} ${
WHERE}`;
console.log(deleteSQL);
const db = await _connect(dbName);
return new Promise((resolve, reject) => {
db.query(deleteSQL, (err, result) => {
if(err) reject({
ok: -1, message: "删除数据失败"});
else if(result.affectedRows) resolve({
ok: 1, message: "删除数据成功"});
else resolve({
ok: -1, message: "表中没有找到该数据所以没删除数据"});
});
});
}
7.计算数据条数。
// 计算数据条数(数据库名,表名,行的名字,计算条件(字符串)) 条件没有不要传""(即不写condition),""会报错
async countDocuments(dbName, tableName, rowName="id", condition){
const WHERE = condition === undefined ? "" : `where ${
condition}`;
const countSQL = `select count(${
rowName}) from ${
tableName} ${
WHERE}`;
console.log(countSQL);
const db = await _connect(dbName);
return new Promise((resolve, reject) => {
db.query(countSQL, (err, result) => {
console.log(err, result);
if(err) reject({
ok: -1, message: "计算表内数据条数错误"});
else if(result) resolve({
ok: 1, message: "计算表内数据总条数成功", count: result[0]["count("+rowName+")"]});
});
});
},
8.分页查找数据。
// 分页(数据库名,表名,页码下标,限制数量,控制对象(sort,condition)) sort和condit要写成sql语句形式!!
async page(dbName, tableName, pageIndex=1, limit=5, control={
}){
const {
count} = await countDocuments(dbName, tableName, "goods_id", control.condition);
console.log("总条数" + count);
let sumPage = Math.ceil(count / limit);
if(sumPage < 1) sumPage = 1;
if(pageIndex > sumPage) pageIndex = sumPage;
const pageObj = {
skip: (pageIndex - 1) * limit,
limit,
sort: control.sort,
condition: control.condition
}
const {
results} = await findDocuments(dbName, tableName, pageObj);
return {
ok: 1, message: "分页查找成功", pageIndex, limit, sumPage, [tableName]: results};
}
八、md5第三方依赖包,用来md5加密的,使用方式为md5(加密数据);
九、jwt-simple第三方依赖包,我用来生成token令牌的,encode编码,decode解码。参一为编码/解码数据,参二为钥匙(我用的字符串,还可不可以用其它的数据类型不知道)。