Express + Mongoose 极简入门
今天尝试使用express + mongoose,构建了一个简单的Hello world,实现以下功能:
- 定义mongodb使用的Schema,一个User
- 访问/输出Hello world
- 访问/init向mongodb插入初始化数据
- 访问/users从mongodb中取数据,并以json方式发送到浏览器
各功能都是极简单的试用,没有用到复杂的功能,但也有一定的参考价值,希望对大家有所帮助。
本次使用到的模块如下:
- mongoose
http://mongoosejs.com/
一个在nodejs中使用的对mongodb进行建模的工具,可以定义一些Schema(定义每个doc里的字段名、类型、初始值、验证条件等),增删改查等,功能比较贴心。 - express
http://expressjs.com
nodejs环境中的web framework,提供了比nodejs的原始api高一级的抽象,方便进行web编程,如router、request/response的处理等,有很多基于它的模块或框架 - express-mongoose
https://github.com/LearnBoost/express-mongoose
让express中的某些方法,如res.send等,支持mongoose返回的查询,减少嵌套
在开始之前,先在项目目录的根目录下安装各模块:
npm install mongoose
npm install express
npm install express-mongoose
项目代码放在这里,可供参考:https://github.com/freewind/express-mongoose-demo
一、使用express创建一个Hello, world
创建一个app.js,内容如下:
var express = require("express");
var app = express.createServer();
app.get(‘/’, function(req, res) {
res.send(‘Hello, world’);
});app.listen(3000);
短短几行代码,创建了一个app server。它监听于端口3000,并且访问/时,会向客户端发送Hello world.
二、试用/
启动该程序:
node app.js
如果没有提示错误,说明启动成功。
打开浏览器,访问:http://localhost:3000
显示如下:
![]()
三、定义Models
创建一个models.js,用于定义程序中使用的model(主要是Schema)。内容如下:
var mongoose = require(‘mongoose’);
var Schema = mongoose.Schema;
// Define User schema
var _User = new Schema({
email : String,
name : String,
salt : String,
password : String
});// export them
exports.User = mongoose.model(‘User’, _User);
这里定义了两个Schema,一个User。为了简便好认,我在Schema前面加了一个下划线,当然你也可以使用其它命名,如UserSchema等。
在定义Schema时,还可以设一些默认值、验证什么的,但这里先忽略,毕竟是极简试用。
mongoose.model(‘User’, _User);
这一句中,第一个参数相当重要,它是给User这个schema,定义了一个名字。其它地方如果想使用这个model,可以这样:
var User = mongoose.model(‘User’)
但在这里,我们直接把它放在exports里了,更方便:
exports.User = mongoose.model(‘User’, _User);
四、/init
现在要把models.js导入到app.js中,并且定义一个/init,访问它时将会向数据库中插入一些数据。代码如下:
var express = require("express");
var mongoose = require(‘mongoose’);var models = require(‘./models’);
var User = models.User;
mongoose.connect(‘mongodb://localhost/express-mongoose-demo’);
var app = express.createServer();
// init data. Use "get" to simplify
app.get(‘/init’, function(req, res) {
var user = new User({
email : ‘nowind_lee@qq.com’,
name : ‘Freewind’
});
user.save();
res.send(‘Data inited’);
});app.listen(3000);
首先导入了mongoose模块,以前之前定义的models.js。然后将models.User取出来供下面使用。
下面这句话用于连接mongodb,这里使用express-mongoose-demo
mongoose.connect(‘mongodb://localhost/express-mongoose-demo’);
接着定义/init,为了演示方便起见,这里使用http get,可直接在浏览器中访问该url。如果在真实程序中,应该使用app.post(‘/init’, …)
打开浏览器,访问:http://localhost:3000/init
![]()
提示数据已经初始化。使用mongodb的控制台,查询结果如下:
![]()
看到数据的确已经插入到mongodb中了。
五、/users
接着实现/users,查询User数据,并以json格式返回到浏览器端。代码很简单,如下:
app.get(‘/users’, function(req, res) {
User.find(function(err, doc) {
res.json(doc);
});
});
打开浏览器,访问http://localhost:3000/users
![]()
果然看到json数据过来了。
但看看这段代码,里面有两个嵌套。如果数据再复杂一些的话,可能嵌套更多,就不易读了。能不能想办法让它简化一点呢?
下面就该express-mongoose出场了。
六、express-mongoose
express-mongoose项目就是为了简化express和mongoose。首先导入它:
require(‘express-mongoose’);
然后将/users方法改写成:
app.get(‘/users’, function(req, res) {
res.send(User.find());
});
看这里,直接用res.send就直接发送了,不用传回调函数了,代码简单了很多。
重启app.js,再访问:http://localhost:3000/users,截图如下:
![]()
果然效果一样。
如果去掉express-mongoose,会是什么效果呢?让我们先去掉:
require(‘express-mongoose’);
再访问:
![]()
现在返回的就是User.find()这个query的值,而不是查询结果。
今天就到这里,以后将慢慢加入更多的功能。
Express + Mongoose 极简入门的更多相关文章
- Git 极简入门教程学习笔记
Git 极简入门教程 http://rogerdudler.github.io/git-guide/index.zh.html 测试用 https://github.com/xxx/BrnShop. ...
- .Net Core in Docker极简入门(下篇)
Tips:本篇已加入系列文章阅读目录,可点击查看更多相关文章. 目录 前言 开始 Docker-Compose 代码修改 yml file up & down 镜像仓库 最后 前言 上一篇[. ...
- ElasticSearch极简入门总结
一,目录 安装es 项目添加maven依赖 es客户端组件注入到spring容器中 es与mysql表结构对比 索引的删除创建 文档的crud es能快速搜索的核心-倒排索引 基于倒排索引的精确搜索. ...
- Spring Security极简入门三部曲(上篇)
目录 Spring Security极简入门三部曲(上篇) 写在前面 为什么要用Spring Security 数据库设计 demo时刻 核心代码讲解 小结 Spring Security极简入门三部 ...
- Spring Security极简入门三部曲(中篇)
目录 Spring Security极简入门三部曲(中篇) 验证流程 Authentication接口 过滤器链 AuthenticationProvider接口: demo时刻 代码讲解 小结 Sp ...
- Express4+Mongodb极简入门实例
一.准备工作: 1.启动mongodb:bin目录下运行 2.在test数据库里插入一条数据: 二.正式开始: 1.通过应用生成器工具 express 快速创建一个应用的骨架,参考Express中文网 ...
- Spring Boot 如何极简入门?
Spring Boot已成为当今最流行的微服务开发框架,本文是如何使用Spring Boot快速开始Web微服务开发的指南,我们将创建一个可运行的包含内嵌Web容器(默认使用的是Tomcat)的可运行 ...
- Nginx 极简入门教程!
上篇文章和大家聊了 Spring Session 实现 Session 共享的问题,有的小伙伴看了后表示对 Nginx 还是很懵,因此有了这篇文章,算是一个 Nginx 扫盲入门吧! 基本介绍 Ngi ...
- 【Java杂货铺】用Security做权限极简入门
原来大多数单体项目都是用的shiro,随着分布式的逐渐普及以及与Spring的天生自然的结合.Spring Security安全框架越受大家的青睐.本文会教你用SpringSecurity设计单项目的 ...
随机推荐
- JS中this的4种绑定规则
this ES6中的箭头函数采用的是词法作用域. 为什么要使用this:使API设计得更简洁且易于复用. this即不指向自身,也不指向函数的词法作用域. this的指向只取决于函数的调用方式 thi ...
- @Transactional spring事务回滚相关
还可以设置回滚点,看下面 /** * 用户登录接口 * * * 1明确事务方法前的命名规则 * 2保证事务方法执行的时间尽可能的短,不允许出现循环操作,不允许出现RPC等网络请求操作 * 3不允许所有 ...
- Skills CodeForces - 613B (双指针)
大意: $n$门课, 第$i$门分数$a_i$, 可以增加共$m$分, 求$cnt_{mx}*cf+mi*cm$的最大值 $cnt_{mx}$为满分的科目数, $mi$为最低分, $cf$, $cm$ ...
- 什么是 Serverless 应用引擎?优势有哪些?
Serverless 应用引擎(Serverless App Engine,简称 SAE)是面向应用的 Serverless PaaS 平台,能够帮助 PaaS 层用户免运维 IaaS,按需使用,按量 ...
- redis 学习(12)-- redis 发布订阅
redis 发布订阅 发布订阅模式中的角色 发布者(publisher) 订阅者(subscriber) 频道(channel) 如图所示: 发布者发布消息到频道,订阅了频道的订阅者可以收到消息,订阅 ...
- NIO、BIO、AIO
BIO(同步阻塞):Socket编程就是 BIO ,操作时会阻塞线程,并发处理能力低 .阻塞的原因在于:操作系统允许的线程数量是有限的,多个socket申请与服务端建立连接时,服务端不能提供相应数量的 ...
- java中的异常和处理详细理解
异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的. 比如说,你的代码少了一个分号,那么运行出来结果是提示是错误 java.lang.Error:如果你用System.ou ...
- exits 和no exits
exists : 强调的是是否返回结果集,不要求知道返回什么, 比如: select name from student where sex = 'm' and mark exists(select ...
- CentOS查看Java进程并部署jar包
查看Java进程获取pid号:ps -ef|grep java|grep -v grep 部署Javajar包并指定输出日志文件(null不输出):nohup java -jar xx.jar > ...
- LLVM4.0与3.5编译phase对比
说是LLVM4.0和3.5的对比,其实是Clang的4和3.5的对比.在调试Clang编译源码的过程中,发现-S选项在4.0和3.5中的处理不一样,后来使用命令验证了这个事情 jourluohua@j ...