NodeJS05

  • 回调函数:需要得到一个函数内部异步操作的结果

//    setTimeout
//    readFile
//    writeFile
//    ajax

function add(x, y, callback) {
	// callback 就是回调函数
	// var x = 10
	// var y = 20
	// var callback = function(ret){console.log(ret)}
  console.log(1)
  setTimeout(function () {
    var ret = x + y
    callback(ret)
  }, 1000)
}

add(10, 20, function (ret) {
  console.log(ret)
})
  • 关系型数据库和非关系型数据库:

表就是关系 或者说 是 表与表之间存在关系

所有的关系型数据库:

1.通过 sql语言来操作 

2.在操作之前都需要设计表结构

3.数据表还支持约束: 唯一  / 主键 / 默认值 / 非空

非关系型数据库: 有的非关系型数据库就是 key-value键值对 没有表的概念

MongoDB 不需要设计表结构 可以任意的往数据库里存储数据 没有结构性的概念

  • MongoDB数据库

确认mongodb安装成功:在cmd输入 mongbd --version 如果能正确返回mongodb版本号 说明安装成功

有多个数据库 每个数据库中有多个集合 集合中有多个文档 文档结构没有任何限制

集合是数组 集合中存文档 文档是对象

启动和关闭数据库:

1.启动

cmd直接输入mongod 启动数据库

但是mongobd默认使用 mongbd 命令所处盘符根目录下(c盘)的data/bd 目录作为自己的数据存储目录 如果没有该目录 则无法启动数据库

所以在第一次执行启动数据库命令前 要创建db目录 C:\data\db

如果想要修改默认的数据存储路径  mongod --dbpath = 路径

2.关闭

关闭:ctrl + C 即可关闭

3.连接数据库

cmd命令: mongo (默认连接本地数据库)

4.退出数据库

在连接状态输入exit 退出

5.基本命令

show dbs 查看所有数据库

db 查看当前操作的数据库 默认是test

use 数据库名 切换到指定数据库 如果该数据库不存在 则新建该数据库 

db.集合名.insert({}) 向该集合中添加数据

db.集合名.find() 查看该集合的所有数据

  • 在node中操作mongodb

  • 起步:

var mongoose = require('mongoose') //引入mongoose包

mongoose.connect('mongodb://localhost/test', { useMongoClient: true }); //连接数据库

var Cat = mongoose.model('Cat', { name: String });//创建模型 === 设计数据库

var kitty = new Cat({name:'kitty'}) 

kitty.save(function(err){
	if(err){
		console.log('err')
	}
	console.log('success')
})
  • 增删改查基本操作:

var mongoose = require('mongoose') //1.引入第三方包
var Schema = mongoose.Schema //2.mongoose架构

//3.连接本地数据库 test1不需要提前创建 如果不存在 会在向该数据库中插入第一条记录后自动创建
mongoose.connect('mongodb://localhost/test1')

//4.创建文档结构
var userSchema = new Schema({
	username: {
		type: String, //指定数据类型
		required: true //必须有
	},
	password: {
		type: String,
		required: true
	},
	email: {
		type: String
	}
})

//5.将文档结构发布为模型 
/* mongoose.model 用来将架构发布成model
 *  第一个参数: 使用首字母大写的单词来定义要使用该架构的集合名 mongoose会自动将其转成 小写复数 的形式
 *  第二个参数: 已经定义好的架构名
 *  返回值: 模型构造函数 使用函数 实现对文档的增删改查
 */
var user = mongoose.model('User', userSchema)

//6.增加数据
// var user1 = new user({
// 	username:'jiaody1',
// 	password:'123',
// 	email:'jiaody123'
// })
// user1.save(function(err,result){
// 	if(err){
// 		console.log(err)
// 	}
// 	console.log(result)
// })

//7.查询数据 find 可以根据指定条件查询 可以查询到所有文档 即使只有一条记录 result也会返回数组 []
// findOne 查询一条记录 返回对象 {} 查询不到 返回null
// user.findOne({
// 	name: 'kitty'
// }, function(err, result) {
// 	if (err) {
// 		console.log(err)
// 	}
// 	console.log(result)
// })

//8.删除数据
// remove 根据条件删除所有
// findOneAndRemove (conditions,[options],[callback]) 根据条件删除一个
// findByIdAndRemove (id,[options],[callback]) 根据id删除一个
// user.remove({
// 	username: 'jiaody'
// }, function(err, result) {
// 	if (err) {
// 		console.log(err)
// 	}
// 	console.log(result)
// })

//9.更新数据
// update 根据条件更新所有
// findOneAndUpdate (conditions,[options],[callback]) 根据条件更新一个
// findByIdAndUpdate (id,[options],[callback]) 根据id更新一个
user.findByIdAndUpdate('5a001b23d219eb00c8581184', {
  password: '123456'
}, function (err,result) {
  if (err) {
    console.log(err)
  } else {
    console.log(result)
  }
})
  • 使用mongo修改学生信息增删改查练习: 

//stu-mongo.js
var mongoose = require('mongoose') //引入mongoose第三方包

mongoose.connect('mongodb://localhost/stu') //连接mongo数据库

var Schema = mongoose.Schema //架构

var stuSchema = new Schema({
	name:{
		type:String,
		required:true
	},
	gender:{
		type:Number,
		enum:[0,1],
		required:true
	},
	age:{
		type:Number
	},
	hobbies:{
		type:String
	}
})

//var stu = mongoose.model('Student',stuSchema)

// var stu1 = new stu({
// 	name:'jiaody',
// 	gender:0,
// 	age:23,
// 	hobbies:'coding'
// })
// stu1.save(function(err,result){
// 	if(err){
// 		console.log(err)
// 	}
// 	console.log(result)
// })

module.exports =mongoose.model('Student',stuSchema)
//route.js

var fs = require('fs')
var express = require('express')
var router = express.Router() //创建express的路由容器
var stu = require('./stu-mongo')

/*
 * 渲染获取学生信息列表
 */
router.get('/students', function(req, res) {
	// stu.getInfo(function(err,students){
	// 	if(err){
	// 		return res.status(500).send('server error')
	// 	}
	// 	res.render('index.html',{
	// 		students:students
	// 	})
	// })
	stu.find(function(err, result) {
		if (err) {
			return res.status(500).send('server error')
		}
		res.render('index.html', {
			students: result
		})
		console.log(result)
	})
})

//渲染添加学生页面 get
router.get('/students/new', function(req, res) {
	res.render('new.html')
})

// 添加学生 post
router.post('/students/new', function(req, res) {
	/*
	 * 读取数据 req.body (字符串格式) --> 转成对象 --> 在对象中push该条数据 --> 把对象转成字符串 --> 再次写入文件
	 */
	// stu.addInfo(req.body,function(err){
	//  if(err){
	//   return res.status(500).send('error')
	//  }
	//  res.redirect('/students')
	// })	
	new stu(req.body).save(function(err) {
		if (err) {
			return res.status(500).send('server error')
		}
		res.redirect('/students')
	})
})

/*渲染编辑学生信息页面 需要获取要编辑的学生id 然后使用模板渲染编辑页面
 * id 信息保存在 req.query.id 中
 */
router.get('/students/edit',function(req,res){
	stu.findById(req.query.id.replace(/"/g,''),function(err,student){
		if(err){
			return res.status(500).send('server error')
		}
		//使用模板渲染edit.html 页面 传数据
		res.render('edit.html',{
			student:student
		})
	})
})

/*
 * 渲染编辑页面 post
 * 先获取提交的表单数据 req.body 然后更新表单
 */
router.post('/students/edit',function(req,res){
	// stu.updateInfo(req.body,function(err){
	// 	if(err){
	// 		return res.status(500).send('Server error.')
	// 	}
	// 	res.redirect('/students')
	// })
	stu.findByIdAndUpdate(req.body.id.replace(/"/g,''),req.body,function(err){
		if(err){
			return res.status(500).send('server error')
		}
		res.redirect('/students/')
	})
})

/*
 * 根据id删除信息 
 */
router.get('/students/delete',function(req,res){
	// stu.delInfo(req.query.id,function(err){
	// 	if(err)
	// 	{
	// 		return res.status(500).send('Server error.')
	// 	}
	// 	res.redirect('/students')
	// })
	stu.findByIdAndRemove(req.query.id.replace(/"/g,''),function(err){
		if(err){
			return res.status(500).send('server error')
		}
		res.redirect('/students')
	})
})

module.exports = router
  • Promise:

  • 1.Promise基本语法 

var fs = require('fs')

//Promise 是一个构造函数  Promise容器一旦创建 就立即执行里面的代码
//Promise不是异步 Promise中执行的任务一般是异步

var P1 = new Promise(function(resolve, reject) {
	fs.readFile('./a.txt', 'utf8', function(err, data) {
		if (err) {
			reject(err)
		} else {
			resolve(data)
		}
	})
})

var P2 = new Promise(function(resolve, reject) {
	fs.readFile('./b.txt', 'utf8', function(err, data) {
		if (err) {
			reject(err)
		} else {
			resolve(data)
		}
	})
})

var P3 = new Promise(function(resolve, reject) {
	fs.readFile('./c.txt', 'utf8', function(err, data) {
		if (err) {
			reject(err)
		} else {
			resolve(data)
		}
	})
})

P1.
then(function(data) {
	// then 方法中接收的 第一个function 就是容器中的 resolve 函数 
	// function 中接收的参数data 就是resolve接收的参数
	console.log(data)
	return P2
	/* return 中接收到的参数 会在下一个 then 中的 第一个function 作为参数被接收 
	*  没有return  后面接收到的就是 undefined
	*  如果return的是一个Promise对象 则下一个then中第一个function 就是该Promise对象的resolve函数
	*/ 
},function(err){
	// then 方法中接收的 第二个function 就是容器中的 reject 函数 
	// function 中接收的参数err 就是 reject 接收的参数
	console.log(err)
})
.then(function(data){
	console.log(data)
	return P3
})
.then(function(data){
	console.log(data)
})
  • 2.封装readFile 

var fs = require('fs')

function pReadFile(filePath) {
	return new Promise(function(resolve,reject){
		fs.readFile(filePath, 'utf8', function(err, data) {
			if (err) {
				reject(err)
			} else {
				resolve(data)
			}
		})
	})
}

pReadFile('./a.txt')
.then(function(data){
	console.log(data)
	return pReadFile('./b.txt')
})
.then(function(data){
	console.log(data)
	return pReadFile('./c.txt')
})
.then(function(data){
	console.log(data)
})

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【优质项目推荐】 1、项目代码均经过严格本地测试,运行OK,确保功能稳定后才上传平台。可放心下载并立即投入使用,若遇到任何使用问题,随时欢迎私信反馈与沟通,博主会第一时间回复。 2、项目适用于计算机相关专业(如计科、信息安全、数据科学、人工智能、通信、物联网、自动化、电子信息等)的在校学生、专业教师,或企业员工,小白入门等都适用。 3、该项目不仅具有很高的学习借鉴价值,对于初学者来说,也是入门进阶的绝佳选择;当然也可以直接用于 毕设、课设、期末大作业或项目初期立项演示等。 3、开放创新:如果您有一定基础,且热爱探索钻研,可以在此代码基础上二次开发,进行修改、扩展,创造出属于自己的独特应用。 欢迎下载使用优质资源!欢迎借鉴使用,并欢迎学习交流,共同探索编程的无穷魅力! 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值