为了让各位小伙伴快速上手,加深对于 mongoose 的了解,我特地结合之前的项目整理了一下关于 mongoose 的一些基础知识,这些对于实战都是很有用的。...相信看了这篇文章,一定会对你快速上手,了解使用 mongoose 有不小的帮助。 mongoose 涉及到的概念和模块还是很多的,大体有下面这些: ?...(uri, options); 回调 connect()函数也接收一个回调参数,其返回一个 promise。...mongoose.connect(uri, options, function(error) { // 检查错误,初始化连接。回调没有第二个参数。...find() 第一个参数表示查询条件,第二个参数用于控制返回的字段,第三个参数用于配置查询参数,第四个参数是回调函数,回调函数的形式为function(err,docs){} Model.find(conditions
}else{ console.log('users list --default: '+docs); // 因为是回调函数...}else{ console.log('users list --default: '+docs); // 因为是回调函数...这样做是为了避免一个问题: 函数里头function(err,docs)是属于回调函数的,也就是说getUserUp()函数的处理完与回调函数中搜索在线用户的处理完 是两个概念。...因为console.log("user list --default:",docs) 会输出你这个新上线的用户 但下边的console.log("user list",users) 输出值为空 所以回调函数会后执行...client var client = { Socket: socket, name: '----' }; 所以还是用回上一种方式,把socket.emit放到回调函数里边确保执行顺序
7.实现学生信息展示功能 3.第三方模块router 功能:实现路由 使用步骤: 1.获取路由对象 2.调用路由对象提供的方法创建路由 3.启用路由,使路由生效 const getRouter = require...4.接收客户端传递过来的学生信息 5.将学生信息添加到数据库中 6.将页面重定向到学生信息列表页面 6.学生信息列表页 1.从数据库中将所有的学生信息查询出来 2.通过模板引擎将学生信息和HTML模板进行拼接...http.createServer(); // 请求响应事件 app.on('request', (req, res) => { // res.end('ok'); // router和serve 里面的第三个参数,回调函数必写...= require('mongoose'); // 创建学生集合规则 const studentsSchema = new mongoose.Schema({ name: { ...('Student', studentsSchema); // 导出学生集合 module.exports = Student; 4.实现路由功能 // 引入路由模块 返回值为方法 const getRouter
回调 connect()函数接受回调函数,或返回一个Promise keepAlive 对于长期运行的后台应用,启用毫秒级 keepAlive 是一个精明的操作。...mongoose.connect(uri,{keepAlive:120}) 五、models-模型 Models 是从 Schema 编译来的构造函数。...它们的实例就代表着可以从数据库保存和读取的 documents。 从数据库创建和读取 document 的所有操作都是通过 model 进行的。..._id); }) 异步 Post 钩子 如果你给 post 钩子的回调函数传入两个参数,mongoose 会认为第二个参数是 next()函数,可以通过 next 触发下一个中间件 schema.post...返回的一切对象: const mongoose = require('mongoose') const Schema = mongoose.Schema; const personSchema =
Promise的回调函数也只能拿到前面状态凝固的结果 Promise缺点: 1 无法取消Promise,一旦新建它就会立即执行,无法中途取消 2 如果不设置回调函数(没有捕获错误),Promise...它返回的是一个新的Promise对象。 03 Promise.prototype.catch() catch方法是.then(null,onrejected)的别名,用于指定发生错误时的回调函数。...Promise的all方法提供了并行执行异步操作的能力,并且在所有异步操作都执行完毕后才执行回调,只要其中一个异步操作返回的状态为rejected那么Promise.all()返回的Promise即为rejected...状态,此时第一个被reject的实例的返回值,会传递给Promise.all的回调函数: ?...,以谁为准执行回调」,以下就是race的执行过程: ?
连接错误:')); db.once('open',function(){ //一次打开记录 }); 注意: 成功开启数据库后,就可以执行数据库相应操作,假设以下代码都在回调中处理...Model和Entity都有能影响数据库的操作,但仍有区别,后面我们也会做解释 二、新手指引 如果您还不清楚Mongoose是如何工作的,请参看第一章快速通道快速浏览他的用法吧 1....6.1 查询的方式 通常有2种查询方式,一种是直接查询,一种是链式查询(2种查询都是自己命名的) 6.1.1 直接查询 在查询时带有回调函数的,称之为直接查询,查询的条件往往通过API来设定,例如...query,query没有执行的预编译查询语句,该query对象执行的方法都将返回自己,只有在执行exec方法时才执行查询,而且必须有回调。 ...callback); 7.Validation 数据的存储是需要验证的,不是什么数据都能往数据库里丢或者显示到客户端的,数据的验证需要记住以下规则: 验证始终定义在SchemaType中 验证是一个内部中间件
再node中,无论事*nix还是Windows平台,内部完成io任务的另有线程池。 Node的循环机制,启动时又一个死循环,每执行一次循环体称为Tick。每次循环处理事件。如果事件存在回调则处理回调。...网络请求是生产者,源源不断等为node提供不同的事件,这次事件被传递导对应的观察者那里,事件循环则从观察者那里取出事件并处理 Node8起新增了 util.promisify() 方法,可以快捷的把原来的异步回调方法改成返回...= util.promisify(fs.readFile); fileResult = await readFileAsync(sourcePathFile); 举例2 /** * 执行 shell 返回...const mongoose = require('mongoose'); // MongoDB connect function mongoDBConnect() { mongoose.connect...(`${config.mongo.url}${config.mongo.database}`); return mongoose.connection; } mongoDBConnect()
数据库的所有操作都是异步操作 1.使用create方法创建文档 通过回调函数的方法获取异步API // 向集合中插入文档 Course.create({ name: 'JavaScript',...result)); 1.8案例:用户信息增删改查 搭建网站服务器,实现客户端与服务器端的通信 连接数据库,创建用户集合,向集合中插入文档 当用户访问/list时,将所有用户信息查询出来 实现路由功能...呈现用户列表页面 从数据库中查询用户信息 将用户信息展示在列表中 将用户信息和表格HTML进行拼接并将拼接结果响应回客户端 当用户访问/add时,呈现表单页面,并实现添加用户信息功能...当用户访问/modify时,呈现修改页面,并实现修改用户信息功能 修改用户信息分为两大步骤 1.增加页面路由 呈现页面 1.在点击修改按钮的时候 将用户ID传递到当前页面...2.从数据库中查询当前用户信息 将用户信息展示到页面中 2.实现用户修改功能 1.指定表单的提交地址以及请求方式 2.接受客户端传递过来的修改信息 找到用户 将用户信息更改为最新的
作为我的第一个完全由自己构思的前端项目,同时作为一个我自己每天都需要用到的项目;从制定计划到完成 0.1 版本,我是如何完成 Aofuji Analytics 的开发的?...数据库则是选择了 MongoDB,对于一般的使用,MongoDB Atlas 提供的 500 连接数免费数据库非常简单方便,并且数据库本身由于 mongoose 的协助使用也十分便捷。...window 上注册全局方法顾调用 en:自定义事件名 et:事件类型 (传入事件对象或事件名) 为了避免在 tracker 中使用 cookie,view 类型的特殊处理:所有 view 类型请求将使用带回调的...XHR 发送,当服务器返回 201 (即 sid 未发送或不存在) 时设置 localStorage 存储新的 sid,当服务器返回 204 时无回调;同时,当发送除 view 类型以外的请求却未发送有效的...之前需要检测以下情况: 十五分钟内没有同用户同页访问:写入新的 view 十五分钟内有同用户同页访问:检查是否需要更新 referrer,并更新 date 为最新时间 pvt 的更新需要使用 $inc 从初值
我们从设计 API 开始。...在前面创建的 Todo 模块的帮助下,我们现在可以从 MongoDB 获取数据并返回 Todo 数组。...也就是说,我们现在可以为 API 创建一些路由,并使用这些方法来处理请求。...: ITodo } 这里, ITodo 接口需要跟 API 返回的数据类型一样。这里没有 mongoose , 所以需要加一些额外的属性来匹配 API 定义的数据类型。...getTodos() 方法会返回 promise —— 因此,我们可以调用 then 函数并用获取到的数据更新 state,或者在发生任何错误时抛出一个错误。
当然,前面说的都是虚的,其实真正吸引我的是koa通过es6的写法,利用async函数,解决了express.js中地狱回调的问题,并且koa不像express一样自带那么多中间件,对于一个私有项目来说,...router.use(路由模块.routes()) ... router.use(路由模块.routes()) // 测试路由连接 router.get('/test-connect', async...不过这个项目除了使用mysql,也还有用到mongo,接下来看看mongodb怎么用 使用mongoose作为mongodb的中间件 // mongoose入口 import mongoose from...mongodb来存储埋点信息 因为这个就是一个单纯的记录接口,所以需要设计的比较通用 - 即除了关键几个字段,调用方传什么就保存什么 埋点行为对用户来说是无感知的,所以不设计反馈信息,如果埋点出错也是由内部处理...type: string path: type: string swagger官方配置工具 推荐一个vscode插件 - facility插件,用来快速生成注释
话不多说,先上代码: const mongoose = require('mongoose') const config = require('....= connectMongoDB(config.database.mongo) module.exports = { mongoInstance } 这套连接方法能够满足以下需求,当然,这也是从我的服务需要满足的需求中总结而来的...: 开发环境下能够打印详细的数据库操作信息 与数据库断开连接后,所有涉及到数据库读写操作的命令均会立即返回错误,而不会等待重连进而造成接口超时 服务启动并成功与数据库建立连接后,如果数据库出现问题造成连接中断...核心意思就是将 bufferMaxEntries 设为 0 同时将 bufferCommands 设为 false,可以让驱动在未连接到数据库的时候,操作立即返回失败,而不是一直在等待重连。...解决方法也不是没有,就是比较鸡肋:在 mongoose 连接的 'error' 事件监听回调函数中尝试重连。但是需要设置最大重试次数,否则会发生内存泄露。
传统的回掉函数 ---- 先准备三个传统的回调函数,示例很简单,就是拼接下字符串。 ? 回掉函数嵌套 ---- 让上面三个回掉函数后者的输入依赖于前者的输出,于是就形成了回调函数嵌套。 ?...分别监听不同的事件,在事件内部处理不同的函数,并控制触发下一个事件,看上去优雅多了不是吗,不过 event 的处理方式似乎被很多人所遗忘。...不可动摇的基石 promise ---- 各种异步流程的第三方库如 co、async、bluebird 都是基于 promise ,而mongoose、sequelize 这些数据库 ORM 也都会默认支持...promise 形式的返回值,ES6 的 async/await 当然也是基于 promise,所以你是免不了跟 promise 打交道的。
从代码中可以看出,监听了几个事件,并且执行触发了connected事件,这表示连接成功 connection中不止有如上几个事件,关键看你想要监听哪个事件。 ...从图中可以看到插入成功! 更新 Model.update(conditions, update, [options], [callback]) var User = require("....} else { console.log("Res:" + res); } }) } del(); 结果就不贴了,res中会返回是否成功以及影响的行数...mongoose操作基本入门大致就是这些,自已试一下,入门完全没问题,并且比node-mongodb-native还是要简单明了一些, 在node.js中操作数据库,如果逻辑相对复杂时,大量的回调嵌套还是比较郁闷的...,下一篇于mongoose操作多逻辑组合回调嵌套的问题给出一种方案^_^!
如果不熟悉的话,可以阅读这篇教程[3]快速上手哦。 迷你全栈电商应用实战系列的全部教程如下: 1. 第一部分:用 Vue 搭建前端项目的骨架,实现基于嵌套、动态路由的多页面跳转。...快速开始 代码 你可以在 Github 查看这一部分教程最终的源码:源码地址[4]。...我们大致地看一下 app.js 和 routes/index.js 的内容,快速过一遍 Express 的基础知识。...MongoDB 可以从其官网[8]上下载。...最后是我们的 product Controller ,它内部的操作和我们上面讲到的 manufacturer Controller 基本一致。 const Model = require('..
根据特定于每个服务的规则,网关将请求路由到所请求的微服务或返回错误代码(或更少的信息)。大多数网关在将请求传递给后面的微服务时将身份验证信息添加到请求中。这允许微服务在需要时实现用户特定的逻辑。...出于方便和性能的原因,网关可以提供在内部路由到许多不同微服务的外观(“虚拟”端点)。...请求还支持在多个微服务之间拆分请求的聚合策略:单个公共端点可以聚合来自许多不同内部端点(微服务)的数据。 所有返回的数据都是JSON格式。...另请查看我们关于Falcor的帖子,该帖子允许从多个来源轻松获取数据。 ? 通过记录错误并返回少于请求的信息来处理失败的内部请求。...这使得每个微服务的开发更容易和更快速。
系统架构师负责设计系统整体架构,从需求到设计的每个细节都要考虑到,把握整个项目,使设计的项目尽量效率高,开发容易,维护方便,升级简单等 这是百度百科的答案 ---- 大多数人的问题 如何成为一名前端架构师...Prevent promise rejection exits process.on('unhandledRejection', gracefulShutdown); }); 几个优秀的地方 每个回调函数都会有声明功能注释...routes app.use(v4.routes()); module.exports = app; 逻辑清晰,自上而下,首先连接db数据库,挂载各种事件后,经由koa各种中间件,而后真正使用koa路由提供...else { ctx.status = err.status || 500; ctx.body = err.message; } } }; 这样只要任意的server层内部出现异常...,只要抛出,就会被error中间件处理,直接返回状态码和错误信息.
5、如果启动失败,证明上边的操作有误,在控制台输入 sc delete MongoDB 删除之前配置的服务,然后从第一步再来一次。...callback 当操作完成以后调用的回调函数。... options 查询选项(常用 skip、limit) 示例:{skip: 3, limit: 1} callback 回调函数...,查询结果会通过回调函数返回 这里回调函数必须传,如果不传回调函数,压根就不会去查询 */ ---------------------------------...用来修改一个或多个文档 - 参数: conditions 查询条件 doc 修改后的对象 options 配置参数 callback 回调函数
使用 vue-resource 从后台获取数据,数据的处理全部都在前端,所以后端要做的事情很简单——把前端打包好的数据存进数据库中和从数据库中取出数据。前后端使用统一的路由命名规则。...> { // success callback }, response => { // error callback }); get 请求 前端发起 get 请求,当请求成功被返回执行第一个回调函数...,请求没有被成功返回则执行第二个回调函数。...{ console.error(err) return } res.send(docs) }) }) post 请求 前端发起 post 请求,当请求成功被返回执行第一个回调函数...,请求没有被成功返回则执行第二个回调函数。
1.1 NoSql数据库优缺点 在优势方面主要体现在下面几点: 简单的扩展 快速的读写 低廉的成本 灵活的数据模型 在不足方面主要有下面几点: 不提供对SQL的支持 支持的特性不够丰富 现有的产品不够成熟...2.1 主要特性 面向集合存储,易于存储对象类型的数据 模式自由 支持动态查询 支持完全索引,包含内部对象 支持复制和故障恢复 使用高效的二进制数据存储,包括大型对象 文件存储格式为 BSON (一种...下载地址 4 Koa + Mongodb 操作 4.1 安装链接 npm i mongoose -Sconst mongoose = require('mongoose') // 默认 27017 端口...1 开始,后台从 0 开始 limit = Math.max(+limit, 10) // 操作数据库一定要 await ctx.body = await User.find().limit...ctx.params.id)) { ownUser.following.push(ctx.params.id) ownUser.save() } ctx.status = 204 }使用put方法注册路由
领取专属 10元无门槛券
手把手带您无忧上云