文档章节

nodejs+express+mongodb简单的例子

扬州炒饭
 扬州炒饭
发布于 2014/09/11 11:45
字数 1995
阅读 66429
收藏 36
点赞 12
评论 22

简单的介绍下node+express+mongodb这三个东西。

node
:是运行在服务器端的程序语言,表面上看过去就是javascript一样的东西,但是呢,确实就是服务器语言,个人觉得在一定层次上比c灵活,java就不提了。反正你只要认为node可以干很多事就行了,绝对不只是web开发。
express
:这货呢,就是node的一种框架,node有很多的开源框架,express是一个大神开发的(这尊神已经移驾到go语言的开发去了)。express可以让你更方便的操作node(因为原生的node写起来比较麻烦,而且因为node是事件驱动的,所以有很多异步回调,写多了就看着晕...)
mongodb:这是一种非关系数据库(nosql),太深的东西我也不清楚,反正这货也有很强大的地方,缺点就是不适合数据一致性要求高的比如金融方面的开发。但是优点就
总结:也就是说node和mongodb组合起来特别适合一个应用场景——速度快,处理量大的情况。

下面先说说准备工作:(以windows8.1系统环境为例)
1.node:先下载安装nodejs,下载地址http://www.nodejs.org/,安装好了之后检查是否在系统环境变量里自动配置好了path,如果没有,请把node的安装地址配置到path里去。然后在cmd里敲入node,如果可以,那么这一步ok了,很简单吧。
2.express:这个安装分两种,一种是全局安装,一种是本地安装。网络上说的玄乎玄乎的,但是实际操作中你会发现不同的系统环境会出现问题,比如win8.1中文用户名情况下,你得改变npm的全局路径(npm是node模块包管理程序,在你安装好node的时候已经自带npm了),操作:
prefix = 自定义模块目录
cache = 自定义缓存目录
接着安装express(新版本4.X以上要安装express-generator)
npm i -g express(旧版本npm i -g express+版本号
npm i -g express-generator
(如果想本地安装在和npm同一个目录下,先cd到node_modules目录,再使用npm i express-generator命令,然后再将node_modules目录下的./bin配置到环境变量path里去)
测试:
express -V 成功的话会显示版本号
3.mongodb:这个数据库安装很简单,下载地址http://www.mongodb.org/。安装好了,就在cmd里cd到mongodb安装目录下的bin目录,然后敲命令:
mongod --dbpath="mongodb安装目录\data" --logpath="mongodb安装目录\log\log.txt" --install --serviceName MongoDB --serviceDisplayName MongoDB
操作完,你会发现,你的电脑的服务里多了一个MongoDB服务,没错,就是它,然后你运行这个服务就行了。

正题:搭建简单的node+express+mongodb项目

先在cmd控制台里cd到一个目录下面,记住这你的workspace,然后是用是用express创建一个app项目
express hello-world -e (-e表示支持ejs模板引擎,默认是jaden。什么事模板引擎,比如jsp...太深的我也不懂。本人比较擅长html原生的东西,像这种模板引擎我也是第一次使用,也蛮方便的哦,不过在我看来,没啥用, 我不需要,但是可能你需要...)
然后我们再下载依赖包
npm i (这样就会自动将项目需要的依赖modules安装到项目的modules里去了)
我们cd到hello-world目录下,是用命令
npm start 启动项目(也可以是node ./bin/www,旧版本直接node app.js,因为具体要看package.json里的启动配置了)
我们可以在浏览器地址栏里敲入 http://127.0.0.1:3000/ 这就是你的第一个express创建的node app。
是不是很哈皮。。。

我们研究下express创建项目
你需要了解的项目主要目录为:routes和views,你最好再在项目里新建一个目录叫models(作用后面讲)
routes里index.js配置的都是get和post请求的路径映射关系,很简单的哦。
views里index.ejs就相当于一个html文件,里面就是一些html标签和<%%>标签,感觉和jsp差不多哦。
看起来不错的样子,标准的MVC框架(models里放模型,views里面放展示,routes里面放控制)

上面我们已经生成好了app原型,接着我们设计数据库
cmd命令行里:
mongo //进入数据库
use hello-world //创建项目数据库
db.addUser("shuaige", "123456") //给这个数据库创建了一个叫帅哥的账号,密码123456 (但是我觉得可能我理解的不到位,你也可以不做这个操作)
然后,我们就为这个hello-world数据库创建collection(collection就相当于oracle和mysql里的table)
db.createCollection("users") //创建一个集合,也就是表
db.users.insert({userid: "admin", password: "123456"}) //给users里添加一个文档,也就是一条记录账号admin,密码123456
ok,现在检查一下:
db.users.find() //如果看到你刚刚添加的文档记录,就ok咯

好简单的数据库集合以及文档设置好,我们就回到express创建的node项目里,我们需要:   

在models下创建一个user.js,作为实体类映射数据库的users集合 
在views下做几个页面(可以用ejs也可以用html,我就用ejs吧)
在routes下的index.js配置路由,也就是请求映射处理

1在models下创建一个user.js,作为实体类映射数据库的users集合 

user.js

var mongoose = require("mongoose");	//	顶会议用户组件
var Schema = mongoose.Schema;	//	创建模型
var userScheMa = new Schema({
	userid: String,
	password: String
});	//	定义了一个新的模型,但是此模式还未和users集合有关联
exports.user = mongoose.model('users', userScheMa); //	与users集合关联


2在views下面建index.ejs, errors.ejs, login.ejs, logout.ejs, homepage.ejs。 (index是自带的,不用建)

index.ejs 

<!DOCTYPE html>
<html>
  <head>
    <title><%= title %></title>
    <link rel='stylesheet' href='/stylesheets/style.css' />
  </head>
  <body>
    <h1>Hello World</h1>
    <p>Welcome to <%= title %></p>
    <p><a href="login">登陆</a></p>
  </body>
</html>

login.ejs

<!DOCTYPE html>
<html>
  <head>
    <title><%= title %></title>
    <link rel='stylesheet' href='/stylesheets/style.css' />
  </head>
  <body>
    <h1>Hello World</h1>
    <p>Welcome to <%= title %></p>
    <form action="homepage" method="post">
	    <p>
	    	<span>userId:</span>
	    	<br>
	    	<input id="userid" name="userid" type="text">
	    </p>
	    <p>
	    	<span>password:</span>
	    	<br>
	    	<input id="password" name="password" type="password">
	    </p>
	    <p><input type="submit" value="submit"></p>
    </form>
  </body>
</html>

logout.ejs
 

<!DOCTYPE html>
<html>
  <head>
    <title><%= title %></title>
    <link rel='stylesheet' href='/stylesheets/style.css' />
  </head>
  <body>
    <h1>Hello World</h1>
    <p>Welcome to <%= title %></p>
    <p>正在登出...</p>
    <script type="text/javascript">
    	setTimeout(function(){
    		window.location.href = "/";
    	}, 500);
    </script>
  </body>
</html>

homepage.ejs
 

<!DOCTYPE html>
<html>
  <head>
    <title><%= title %></title>
    <link rel='stylesheet' href='/stylesheets/style.css' />
  </head>
  <body>
    <h1>Hello World</h1>
    <p>Welcome to <%= title %></p>
    <p><a href="logout">登出</a></p>
  </body>
</html>

error.ejs 出错页面,我没做,你有兴趣可以自己试试玩玩。

3 在routes下的index.js配置路由,也就是请求映射处理

index.js

var express = require('express');
var router = express.Router();
var mongoose = require('mongoose');
var user = require('../models/user').user;
mongoose.connect('mongodb://localhost/hello-world');

/* GET home page. */
router.get('/', function(req, res) {
  	res.render('index', { title: 'index' });
});

/*login*/
router.get('/login', function(req, res) {
 	 res.render('login', { title: 'login' });
});

/*logout*/
router.get('/logout', function(req, res) {
  	res.render('logout', { title: 'logout' });
});

/*hompage*/
router.post('/homepage', function(req, res) {
	var query_doc = {userid: req.body.userid, password: req.body.password};
	(function(){
		user.count(query_doc, function(err, doc){
			if(doc == 1){
				console.log(query_doc.userid + ": login success in " + new Date());
				res.render('homepage', { title: 'homepage' });
			}else{
				console.log(query_doc.userid + ": login failed in " + new Date());
				res.redirect('/');
			}
		});
	})(query_doc);
});

module.exports = router;


ok,基本上大功告成,可以试试咯。

下面讲讲如何调试服务器端的代码:
我们最好借助一个叫node-inspector的工具包
npm i -g node-inspector //安装node-inspector
然后在cmd里运行
node-inspector
再新打开一个cmd,cd到项目hello-world目录下
node --debug ./bin/www (或者 node --debug-brk ./bin/www , 旧版本express创建的node程序请使用 node --debug app.js)
在浏览器里打开http://127.0.0.1:8080/debug?port=5858
再新建窗口打开http://127.0.0.1:3000/
就在浏览器可以调试服务器端代码。


© 著作权归作者所有

共有 人打赏支持
扬州炒饭
粉丝 41
博文 92
码字总数 24585
作品 0
程序员
加载中

评论(22)

时光青年依旧蓝-
时光青年依旧蓝-
谢谢 1313
时光青年依旧蓝-
时光青年依旧蓝-
堵在门口一段时间了,今天终于进去了,好揪心
鲨鱼梦的小虾米
ypeError: Scheam is not a function
at Object.<anonymous> (e:\webstormProject\node_mongo\hello\models\user.js:3:18)
at Module._compile (module.js:435:26)
at Object.Module._extensions..js (module.js:442:10)
at Module.load (module.js:356:32)
at Function.Module._load (module.js:311:12)
at Module.require (module.js:366:17)
at require (module.js:385:17)
at Object.<anonymous> (e:\webstormProject\node_mongo\hello\routes\index.js:4:12)
at Module._compile (module.js:435:26)
at Object.Module._extensions..js (module.js:442:10)
at Module.load (module.js:356:32)
at Function.Module._load (module.js:311:12)
at Module.require (module.js:366:17)
at require (module.js:385:17)
at Object.<anonymous> (e:\webstormProject\node_mongo\hello\app.js:8:14)
at Module._compile (module.js:435:26)

Process finished with exit code 1
报错为什么,哥们
Nick_Judy
Nick_Judy
router.post('/homepage', function(req, res) {
var query_doc = {userid: req.body.userid, password: req.body.password};
(function(){
user.count(query_doc, function(err, doc){
if(doc == 1){
console.log(query_doc.userid + ": login success in " + new Date());
res.render('homepage', { title: 'homepage' });
}else{
console.log(query_doc.userid + ": login failed in " + new Date());
res.redirect('/');
}
});
})(query_doc);
});
这段代码怎么执行的 求告知9
扬州炒饭
扬州炒饭

引用来自“daisycloud”的评论

请问:
user.count(query_doc, function(err, doc){
if(doc == 1){

}else{

};

这里count()是什么作用?我这边返回的doc == 2
count返回的是mongodb里user集合的符合query_doc条件的文档个数-。-
daisycloud
daisycloud
请问:
user.count(query_doc, function(err, doc){
if(doc == 1){

}else{

};

这里count()是什么作用?我这边返回的doc == 2
扬州炒饭
扬州炒饭

引用来自“Frigyes”的评论

你好,能提供增删改查的案例吗?
这个可能会对你有帮助,https://github.com/YangZhouChaoFan/NodeCRM
F
Frigyes
你好,能提供增删改查的案例吗?
扬州炒饭
扬州炒饭

引用来自“小鱼朱朱”的评论

还请将mongoose及其所需的依赖贴出来
对的,还要使用npm下载 mongoose模块,谢谢提醒。
小鱼朱朱
小鱼朱朱
还请将mongoose及其所需的依赖贴出来
简单一个opengl程序,2D图形移动

很早打算系统的学习一下opengl,但是由于课程以及学习算法占据了时间,一直没能开始,现在这段时间开始弄opengl了,这几天看正在看《Opengl 编程指南 第8版》,首先看了GLSL写shader。这里先...

iaccepted ⋅ 2015/02/13 ⋅ 0

python核心编程-第十一章-个人笔记(二)

7.3 作用域和 lambda lambda 语句中的表达式有和函数相同的作用域 >>> x = 10>>> def foo():... y = 5... bar = lambda: x+y... print bar()... y = 8... print bar() >>> foo()1518 7.4 变量......

好好先生_1028 ⋅ 2016/04/29 ⋅ 0

资源 的使用

(1)获得资源实例 ContextWrapper.getResource ( ); (2) 通过 对应的方法得到相应类型的资源 Resources.getString ( int id ); Resources.getColor (int id ); 例子: String myString = getR......

chuiyuan ⋅ 2014/05/08 ⋅ 0

Ext JS - Hello World

WELCOME TO EXT JS 这个向导提供了一个基本的Ext JS介绍。我们将会以一个非常简单的“hello world”例子来展开讨论。我们将以code是如何在Ext JS中组织的来开始。这个向导同时也包含了许多其...

BuWStudio ⋅ 2014/06/05 ⋅ 0

axios源码分析——取消请求

之前分析了两篇文章 请求流程分析,传送门,戳这里; 拦截器分析,传送门,戳这里; 这篇文章,来分析下取消请求是怎么实现的,先从一个简单的取消请求的例子开始: 这就是一个简单的取消请求...

mz同学x ⋅ 06/18 ⋅ 0

一个简单的Spring的AOP例子

经过这段日子的学习和使用Spring,慢慢地体会到Spring的优妙之处,正在深入地吸收Spring的精华,呵呵。现在写的这个只是个简单AOP例子,包括前置通知,后置通知,环绕通知,和目标对象。写这个例...

Sandy_wu ⋅ 2013/06/08 ⋅ 0

HTTPClient4.3的典型小例子

三个简单的HTTPClient4.3小例子 写三个httpclient的小例子,希望对刚开始学习httpclient的小伙伴们有一个参考↖(^ω^)↗ 1、简单的获取一个HTML页面的内容 public void getHTML() throws Exc...

梦回雪夜观花 ⋅ 2014/03/04 ⋅ 3

MATLAB/Simulink 晶闸管6脉波整流

参考官方例子,实现简单的晶闸管6脉波整流 MATLAB自带例子可以在命令行窗口执行 打开。下面的例子是对原例子的简单修改。 用到的模块: (1)三相电源,50Hz (2)锁相环(三相),脉冲发生器...

ouening ⋅ 04/06 ⋅ 0

js的arguments_javascript

今天突然想研究一下javascript的arguments对象了。 大家对于arguments对象一定都不陌生,先举个简单的例子: / arguments /var g = function(a, b){/ 获取参数 /var _ = arguments;document....

7LIB ⋅ 2012/07/30 ⋅ 0

clojure 新手指南(3)复杂表达式求值

为了理解复杂的表达式和对它的操作,一个首要的前提就是理解”前缀表达式“。这可能会花费你一点时间来习惯它。不过我相信你会很快的爱上这种规则的。你想想,如果你要对多个值进行同一种运算...

凯奥斯 ⋅ 2013/07/03 ⋅ 1

没有更多内容

加载失败,请刷新页面

加载更多

下一页

实验楼—MySQL基础课程-挑战3实验报告

按照文档要求创建数据库 sudo sercice mysql startwget http://labfile.oss.aliyuncs.com/courses/9/createdb2.sqlvim /home/shiyanlou/createdb2.sql#查看下数据库代码 代码创建了grade......

zhangjin7 ⋅ 昨天 ⋅ 0

一起读书《深入浅出nodejs》-node模块机制

node 模块机制 前言 说到node,就不免得提到JavaScript。JavaScript自诞生以来,经历了工具类库、组件库、前端框架、前端应用的变迁。通过无数开发人员的努力,JavaScript不断被类聚和抽象,...

小草先森 ⋅ 昨天 ⋅ 0

Java桌球小游戏

其实算不上一个游戏,就是两张图片,不停的重画,改变ball图片的位置。一个左右直线碰撞的,一个有角度碰撞的。 左右直线碰撞 package com.bjsxt.test;import javax.swing.*;import j...

森林之下 ⋅ 昨天 ⋅ 0

你真的明白RPC 吗?一起来探究 RPC 的实质

你真的明白RPC 吗?一起来探究 RPC 的实质 不论你是科班出身还是半路转行,这么优秀的你一定上过小学语文,那么对扩句和缩句你一定不陌生。缩句就是去除各种修饰提炼出一句话的核心,而不失基...

AI9o後 ⋅ 昨天 ⋅ 2

z-index设置失效?

今天碰到了一个问题,就是在给li设置提示框的时候,有用到遮罩效果,本来想把对应的出现在最顶层,可是不管将li设置的z-index值设为多大,li都没有出现在遮罩层之上。 我在网上查了z-index设...

IrisHunag ⋅ 昨天 ⋅ 0

CyclicBarrier、CountDownLatch以及Semaphore使用及其原理分析

CyclicBarrier、CountDownLatch以及Semaphore是Java并发包中几个常用的并发组件,这几个组件特点是功能相识很容易混淆。首先我们分别介绍这几个组件的功能然后再通过实例分析和源码分析其中设...

申文波 ⋅ 昨天 ⋅ 0

Deepin安装Maven与设置环境变量

wget http://apache.fayea.com/maven/maven-3/3.3.9/binaries/apache-maven-3.3.9-bin.tar.gz export M2_HOME=/opt/apache-maven-3.3.9terwer@terwer-PC:/opt/apache-maven-3.3.9$ PATH=$M......

terwergreen ⋅ 昨天 ⋅ 0

Java对象的序列化与反序列化

Java对象的序列化与反序列化

Cobbage ⋅ 昨天 ⋅ 0

Sqoop

1.Sqoop: 《=》 SQL to Hadoop 背景 1)场景:数据在RDBMS中,我们如何使用Hive或者Hadoop来进行数据分析呢? 1) RDBMS ==> Hadoop(广义) 2) Hadoop ==> RDBMS 2)原来可以通过MapReduce I...

GordonNemo ⋅ 昨天 ⋅ 0

android 插件化 androdpluginmgr 试用

问题1 : 新建了一个简单的工程,打包成release 包,并使用androidpluginmgr 来加载。发现启动了在宿主中的代理Activity 界面。而且宿主程序也意外停止了。 log发现,在 PluginInstrumentat...

Carlyle_Lee ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部