handler(err) }) 更新 model 的 update 方法可以修改数据库中的文档,不过不会把文档返回给应用层。...在Mongoose中,意味着你可以在里嵌套另一个schema。...Model的多个静态辅助方法都可以查询文档 Query实例有一个.then()函数,用法类似Promise 我们看一下demo,查询persons表中name中属性last为Ghost值的文档,只查询...stuff next() }) 在 mongoose5.x 中,除了手动调用 next 函数,还可以返回一个 Promise,甚至是 async/await。..._id); }) 异步 Post 钩子 如果你给 post 钩子的回调函数传入两个参数,mongoose 会认为第二个参数是 next()函数,可以通过 next 触发下一个中间件 schema.post
创建集合 创建集合分为两步,-是对对集合设定规则,二是创建集合,创建mongoose.Schema构造函数的实例即可创建集合。...}).then(result => console.log(result)).catch(err => console.log(err)); 3. mongoDB数据库导入数据 找到mongodb数据库的安装目录...,将安装目录下的bin目录放置在环境变量中。...验证 在创建集合规则时,可以设置当前字段的验证规则,验证失败则插入失败。...(err[k]['message']); } }) 8.集合关联 通常不同集合的数据之间是有关系的,例如文章信息和用户信息存储在不同集合中,但文章是某个用户发表的 要查询文章的所有信息包括发表用户
,将安装目录下的bin目录放置在环境变量中。...在项目根目录下输入以下命令导入 mongoimport -d 数据库名称 -c 集合名称 --file 要导入的数据文件 4.查询文档 find()方法 返回一组文档 // 根据条件查找文档(条件为空则查找所有文档...验证 在创建集合规则时,可以设置当前字段的验证规则,验证失败则插入失败。...(err[k]['message']); } }) 8.集合关联 通常不同集合的数据之间是有关系的,例如文章信息和用户信息存储在不同集合中,但文章是某个用户发表的 要查询文章的所有信息包括发表用户...案例:用户信息增删改查 搭建网站服务器,实现客户端与服务器端的通信 连接数据库,创建用户集合,向集合中插入文档 当用户访问/list时, 将所有用户信息查询出来 将用户信息和表格HTML
('User', userSchema); // 查询用户集合中的所有文档 User.find().then(result => console.log(result)); // 通过_id字段查找文档...默认返回当前集合中的第一条文档 // User.findOne({name: '李四'}).then(result => console.log(result)) // 查询用户集合中年龄字段大于20...并且小于40的文档 // User.find({age: {$gt: 20, $lt: 40}}).then(result => console.log(result)) // 查询用户集合中hobbies...); // 查找到一条文档并且删除 // 返回删除的文档 // 如何查询条件匹配了多个文档 那么将会删除第一个匹配的文档 // User.findOneAndDelete({_id: '5c09f267aeb04b22f8460968...); // 找到要删除的文档并且删除 // 返回是否删除成功的对象 // 如果匹配了多条文档, 只会删除匹配成功的第一条文档 // User.updateOne({name: '李四'}, {age:
如果子文档在更新时出现错误,将直接报在父类文档中,可以这样处理: ChildrenSchema.pre('save',function(next){ if('x' === this.name...6.1 查询的方式 通常有2种查询方式,一种是直接查询,一种是链式查询(2种查询都是自己命名的) 6.1.1 直接查询 在查询时带有回调函数的,称之为直接查询,查询的条件往往通过API来设定,例如...,只有在执行exec方法时才执行查询,而且必须有回调。 ...,不是什么数据都能往数据库里丢或者显示到客户端的,数据的验证需要记住以下规则: 验证始终定义在SchemaType中 验证是一个内部中间件 验证是在一个Document被保存时默认启用的,除非你关闭验证...] //validator是一个验证函数,err是验证失败的错误信息 } }); 7.2 验证失败 如果验证失败,则会返回err信息,err是一个对象该对象属性如下 err.errors
当你想要修改模型时,最好可以直接通过浏览模型文件夹来修改,而不是在包含模型、控制器、加载器和服务的单个文件中找来找去。...我们的示例应用程序是一个简单的用于身份验证的 REST API。当用户注册时,他们的信息被保存在 MongoDB 数据库中。当用户登录时,我们将验证他们的信息,如果验证成功,就返回一个令牌。...它们被几个文件或模块调用,用于验证或修改请求或数据块,因为它们具有可重用的结构。例如,开发一个辅助函数来验证电子邮件的格式是否合法。...例如,当你试图构建一个 try-catch 事件时可以在 catch 部分调用它,并提供必要的参数(如状态、数据和消息)。你可以重用这些定义,而不是在所有地方声明它们。...这项技术已被证明在构建项目时是非常有用的,无论项目的复杂性或团队规模如何。你肯定不希望在生产环境中出现任何错误!
现在已经有了 npm 的日志记录模块。这些模块可以将日志存储在不同格式或级别的文件中。我们将使用流行的ORM Mongoose 讨论 Node.js Express 程序中的 API 日志记录。...那么如何创建一个 Mongoose 插件,以更清洁的方式为你进行记录并简化 API 日志? Mongoose 中的插件是什么? 在 Mongoose 中,模式是可插入的。...如果当前对象的 value 不等于前一个对象中相同属性的值:base[key] 如果该值是对象本身,我们递归调用函数changes 直到它得到一个值,它最终将作为 result[key]=value 存储在...现在我们需要使用架构上可用的 init 和 save 方法。 this.isNew():如果你正在创建新文档,那么只需返回 next()中间件。...(err => { console.log('Caught error while logging: ', err) }) } 结论 在本教程中,你学习了如何创建 Mongoose
; module.exports = router; 当然,数据库连接的逻辑可以不写在goods.js中,但我们暂时先这样写。...实现商品列表查询 step1 先建goods集合对应的model 在根目录下新建一个目录models存放所有的model,新建good.js: ?..."productName": String, // 商品名 "salePrice": Number, // 售价 "checked": String, // 是否被选中(在购物车中...,否则会出现不可预知的结果 module.exports = mongoose.model('Good', productScheme); step2 从goods查找数据并返回 修改goods.js...ps:这里你可以下载一个json格式化的插件,我使用的是jsonview。 3. 实现商品列表查询 进入six-tao仓库。
pm2等方式,在 Worker 线程中,process.exit()将停止当前线程而不是当前进程) app.js入口文件 这里是由koa提供基础服务 monggose负责连接mongoDB数据库 若干中间件负责...(error) { ctx.throw(400, error.message); } }); 此时此刻,使用try catch包裹逻辑代码,当redis清除所有缓存成功即会返回状态码400...= async (ctx, next) => { try { await next(); } catch (err) { if (err?....ctx.body = err.message; } } }; 这样只要任意的server层内部出现异常,只要抛出,就会被error中间件处理,直接返回状态码和错误信息....,不用太多,但是一定要精 以上是我的感悟,后面我会在评论中补充,也欢迎大家在评论中补充探讨!
Mongoose是在node.js环境下对mongodb进行便捷操作的对象模型工具。...://用户名:密码@127.0.0.1:27017/数据库名称') 连接多个数据库 如果你的app中要连接多个数据库,只需要设置多个url以,隔开,同时设置mongos为true mongoose.connect....then(() => console.log("we are connected")) .catch(error => console.log(error)); 我有如下数据 image.png..., url: String, to: String }) module.exports = mongoose.model('Banner', Banner); 创建 query.js ,执行查询.../models/banner'); class SourceController { // 获取首页banner async getBanner(ctx, next) { const
5、mongoose验证 在创建集合规则时,可以设置当前字段的验证规则,验证失败就则输入插入失败。...: true}) // 连接成功 .then(() => console.log('数据库连接成功')) // 连接失败 .catch(err => console.log...,例如文章信息和用户信息存储在不同集合中,但文章是某个用户发表的,要查询文章的所有信息包括发表用户,就需要用到集合关联。...使用id对集合进行关联 使用populate方法进行关联集合查询 集合关联实现 // 用户集合 const User = mongoose.model('User', new mongoose.Schema..., ref: 'User' } })); //联合查询 Post.find() .populate('author') .then((err, result) => console.log
不久之后,这个简单的 “创建” 操作将完成几件事,最终您将获得 1000 行代码,所有这些都在一个函数中。 这违反了单一责任原则。 因此,最好从一开始就将职责划分,以使您的代码保持可维护性。...代码块中,也可以让它失败并通过 'unhandledPromise' 处理 process.on('unhandledRejection',cb)。...DI 或控制反转(IoC)是一种常见的模式,通过 “注入” 或通过构造函数传递类或函数的依赖关系,有助于代码的组织。...这就是创建依赖注入框架的原因。 这个想法是在类中定义你的依赖,当你需要一个类的实例时只需要调用 “Service Locator” 即可。...; next(err); }); app.use((err, req, res) => { res.status(err.status || 500); res.json
= require('mongoose') // 我们把数据的驱动连接URL 写到了另一个文件config文件架下的keys.js中 const db = require("....("users",UserSchema) 然后在 users.js中引入 const User = require('../......catch(err=> console.log(err)) // 如果失败得到一个catch });...}); } }) }) 然后在postman试一试 再去MongoDB中查询一下 最后完整的代码 config/keys.js module.exports = {.../config/keys").mongoURI mongoose.connect(db).then(()=>{ console.log("connected") }).catch(err=> console.log
// 在页面中设置layout export default { layout: 'blank' //默认是default } // 在layout中 ...(渲染)组件(页面组件,即pages文件夹下的文件,不包含components下的)之前在服务端或路由更新之前被调用,即可以进行异步获取数据并返回当前组件。...–简而言之就是fetch 和 asyncData 在组件上不能用。 Vuex ⚠️在nuxt中,vuex需要导出一个方法。...由于components中没法使用fetch,页面刷新时,middleware已经执行了,此时vuex中是没有参数的,就判断为用户没有登录?...mongoose 获取内嵌数组的长度,有没有更好的办法,或者说是既能返回总数也能进行分页? 订单是在数据中库存了的,没有展示,收货地址也只有增加。这两处都可以扩展增删改查的功能。
在 MongoDB 中,数据库和集合都不需要手动创建,当我们创建文档时,如果文档所在的集合或数据库不存在会自动创建数据库和集合。...//在查询时,可以在第二个参数的位置来设置查询结果的--即投影 db.emp.find({}, {ename: 1, _id: 0, sal: 1}); 第四章 Mongoose 4.1 Mongoose...(常用 skip、limit) 示例:{skip: 3, limit: 1} callback 回调函数,查询结果会通过回调函数返回 ...这里回调函数必须传,如果不传回调函数,压根就不会去查询 */ ----------------------------------------------------- StuModel.find({...err) { console.log(count); } }); 4.8 Document--文档对象 通过 Model 对数据库进行查询时,会返回 Document 对象或
$message.error(err); }) } } 后台相关 连接数据库 在server根目录下新建db.js // db.js var mongoose = require('mongoose...如下图是我的student集合: 在该集合中,学生参加过的考试记录,存在exams数组中,当想实现分页查询几条数据的时候,需要用到$slice $slice:[start,size] 第一个参数表示...>{ .... }) }; 还有一种模糊分页查询–查询关联文档再模糊分页查询 先通过populate查询除关联文档,在模糊分页查询 exports.getPapers =...更多的可以看看我项目中的实际代码都在server/controllers下面 关联集合的新增 在系统中,教师可以增加试卷,这个时候我就不知道该怎么保存前台传过来的数据。..._id); // 教师中添加该试卷的_id doc.save(); // 很重要 不save则没有数据 // 第三步
配置https 在根目录新建 ssl 文件夹,放入证书文件 在 app.js 中引入 koa-sslify 和 fs const sslify = require('koa-sslify').default..."nbf": "", // 定义在什么时间之前,该jwt都是不可用的 "iat": "",...中连接数据库 const mongoose = require('mongoose'); const DB_URL = require(".....id=10001 查询单个商品,否则查询全部 .post('/source/good', goodctrl.addGood) .put('/source/good', goodctrl.editGood...id=10001 查询 id 为 10001 的商品 image.png DONE !
方法能够返回promise对象,说明也支持异步函数的语法 1.3 mongoDB数据库导入数据 找到mongodb数据库的安装目录,将安装目录下的bin目录放置在环境变量中。...mongoose验证 在创建集合规则时,可以设置当前字段的验证规则,验证失败就则输入插入失败。...1.7 集合关联 通常不同集合的数据之间是有关系的,例如文章信息和用户信息存储在不同集合中,但文章是某个用户发表的,要查询文章的所有信息包括发表用户,就需要用到集合关联。...,实现客户端与服务器端的通信 连接数据库,创建用户集合,向集合中插入文档 当用户访问/list时,将所有用户信息查询出来 实现路由功能 呈现用户列表页面 从数据库中查询用户信息...,并实现修改用户信息功能 修改用户信息分为两大步骤 1.增加页面路由 呈现页面 1.在点击修改按钮的时候 将用户ID传递到当前页面 2.从数据库中查询当前用户信息 将用户信息展示到页面中
错误异常有两种场景的出现, 一种是代码运行中throw new error没有被捕获 另一种是Promise的失败回调函数,没有对应的reject回调函数处理 针对这两种情况Nodejs都有默认的统一处理方式...') 但是try catch方式无法处理异步代码块内出现的异常,你可以理解为执行catch时,异常还没有发生。.../*处理异常*/ console.log(e.message) } })() 所有异常 process方式 process方式可以捕获任何异常(不管是同步代码块中的异常还是异步代码块中的异常...2 domain.run(function) 在域的上下文运行提供的函数,隐式的绑定了所有的事件分发器,计时器和底层请求。...5 domain.bind(callback) 返回的函数是一个对于所提供的回调函数的包装函数。当调用这个返回的函数时,所有被抛出的错误都会被导向到这个域的 error 事件。
await next() } catch (err) { // 所有的异常都在 app 上触发一个 error 事件,框架会记录一条错误日志 app.emit...('error', err, this) const status = err.status || 500 // 生产环境时 500 错误的详细错误内容不返回给客户端...它的作用在于我们可以将一些常用的动作抽离在 helper.js 里面成为一个独立的函数,这样可以用 JavaScript 来写复杂的逻辑,避免逻辑分散各处。...}}) return mongoose.model('User', UserSchema)} service 先安装哈希依赖: npm install egg-bcrypt -s 在插件中定义:...框架提供了统一的入口文件( app.js)进行启动过程自定义,这个文件返回一个 Boot 类,我们可以通过定义 Boot 类中的生命周期方法来执行启动应用过程中的初始化工作。
领取专属 10元无门槛券
手把手带您无忧上云