咳咳,终于迈出这一步了...这篇文章将是边学边写的真正笔记...用于mark下学习过程中的点滴~

开篇先把我学习参考的文章来源给出,以表示对前人的尊敬:

https://github.com/nswbmw/N-blog/wiki/_pages

Step01

首先,先安装一堆东西,当然我默认的已经把 node 给装好了,接下来要安装的,是项目开发过程中用到的东东~

至于下面装的是什么东东,不知道的自己百度去,这种概念性问题不在笔记之列。

全局安装 express

install -g express-generator

全局安装 supervisor

npm install -g supervisor

下载并安装 mongoDB

官网地址:https://www.mongodb.org/downloads

mongoDB 也有可视化工具,名为 Robomongo,官网地址:http://www.robomongo.org/

Step02

上面几个玩意都安装好后,环境已备,可以开始码字了。

先创建一个 express 项目吧,在你想创建项目的目录下执行下面命令(projectName 是你要创建的项目名称):

express -e projectName

项目创建后,进入刚建好的项目根目录,执行

npm install

安装项目依赖的 node 模块

等模块安装好之后,你就可以执行下面的命令,运行项目程序了

supervisor ./bin/www

执行上面命令后,打开浏览器,在地址栏中输入 http://127.0.0.1:3000/ 然后看到浏览器里显示 Express 的欢迎界面,说明项目创建运行成功。

Step03

接下来,我们要链接数据库,并尝试数据写入和数据读取

首先,我们先在项目根目录找到 package.json 文件

然后打开文件,找到 dependencies 在加上下面几个项目依赖模块

"bson": "~0.4.19",
"connect-flash": "~0.1.1",
"connect-mongo": "~0.4.1",
"express-session": "~1.9.1",
"mongodb": "~1.4.15"

然后再执行

npm install

安装上面添加的几个依赖模块

打开 app.js 将它修改成如下:

var express = require('express');
var path = require('path');
var favicon = require('serve-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser'); var routes = require('./routes/index');
var session = require('express-session');
var MongoStore = require('connect-mongo')(session);
var flash = require('connect-flash'); var app = express(); //设置模版引擎
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs'); app.set(flash()); //设置标题栏小图标
//app.use(favicon(path.join(__dirname, 'favicon.ico'))); app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended: false}));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public'))); routes(app); //404异常处理
app.use(function (req, res, next) {
var err = new Error('Not Found');
err.status = 404;
next(err);
}); //打印错误信息
app.use(function (err, req, res, next) {
res.status(err.status || 500);
res.render('error', {
message: err.message,
error: {}
});
}); module.exports = app;

然后打开 routes/index.js 将它修改成如下:

var User = require('../modules/user');

module.exports = function(app) {
app.get('/', function (req, res, next) {
res.render('index', { title: 'Express' });
}); app.get('/saveUser', function (req, res, next) {
User.save({
name: 'Mike',
password: '123456',
email: 'qwe@163.com'
}, function (err, user) {
res.send('保存用户数据成功!');
});
}); app.get('/getUser', function (req, res, next) {
User.get('Mike', function (err, user) {
res.send({
email: user.email
});
});
});
};

routes/users.js 已经无用,可以删掉。

接下来,在根目录下创建一个 modules 目录,然后在 modules 目录下再创建一个 dataService 目录,所有和数据操作相关的 js 模块都将放在 modules/dataService 目录下

接下来,在 modules/dataService 下创建两个文件 conn.js 和 user.js

conn.js 的代码如下:

var settings = {
cookieSecret: 'myProject',
db: 'dataBaseName',
host: 'localhost',
port: 27017
},
mongodb = require('mongodb'),
Db = mongodb.Db,
Server = mongodb.Server; module.exports = new Db(settings.db, new Server(settings.host, settings.port), {
safe: true
});

user.js 的代码如下:

var mongodb = require('./conn');

var User = {};

//存储用户信息
User.save = function (opts, callback) {
//要存入数据库的用户文档
var user = {
name: opts.name,
password: opts.password,
email: opts.email
};
//打开数据库
mongodb.open(function (err, db) {
if (err) {
return callback(err);//错误,返回 err 信息
}
//读取 users 集合
db.collection('users', function (err, collection) {
if (err) {
mongodb.close();
return callback(err);//错误,返回 err 信息
}
//将用户数据插入 users 集合
collection.insert(user, {
safe: true
}, function (err, user) {
mongodb.close();
if (err) {
return callback(err);//错误,返回 err 信息
}
callback(null, user[0]);//成功!err 为 null,并返回存储后的用户文档
});
});
});
}; //读取用户信息
User.get = function (name, callback) {
//打开数据库
mongodb.open(function (err, db) {
if (err) {
return callback(err);//错误,返回 err 信息
}
//读取 users 集合
db.collection('users', function (err, collection) {
if (err) {
mongodb.close();
return callback(err);//错误,返回 err 信息
}
//查找用户名(name键)值为 name 一个文档
collection.findOne({
name: name
}, function (err, user) {
mongodb.close();
if (err) {
return callback(err);//失败!返回 err 信息
}
callback(null, user);//成功!返回查询的用户信息
});
});
});
}; module.exports = User;

嗯嗯嗯...思考了好一会,代码部分应该已经完成了。但别急着运行,还有一些准备工作需要做。

打开 mongoDB 的安装根目录(拿我自己举例,我安装的是32位版本,安装根目录为:C:\Program Files (x86)\MongoDB 2.6 Standard)

在该目录下创建一个文件夹,名称就是你的数据库名

然后启动命令行工具,进入 mongoDB 的安装根目录下的 lib 目录,然后执行下面命令:

mongod --dbpath ../dataBaseName/

dataBaseName 指是你的数据库名

以上命令的意思是:设置 dataBaseName 文件夹作为我们工程的存储目录并启动数据库

注意:一定要先创建目录(或者已经存在目录),再执行上面的命令,才能成功启动数据库,否则会报错

数据库成功启动之后,我们再重新启动一下我们的 node 服务端程序,就用上文提到过的命令:

supervisor ./bin/www

然后打开浏览器,访问 http://127.0.0.1:3000/saveUser ,就能看到界面上显示 “保存用户数据成功!

再访问 http://127.0.0.1:3000/getUser ,就能看到  {"email":"qwe@163.com"}

再使用 Robomongo 看看数据库是否真的成功写入了信息,如果成功找到和代码中一样的数据,说明写入成功了~~

OK~至此,我们就实现了一个最基础的服务端读写数据库应用雏形了。

补刀几句,这篇笔记通篇没有多少任何关于概念以及工具的说明。

因为它就是一篇执行记录笔记,记录搭建一个 最基础的服务端读写数据库应用雏形 的各个步骤。

如果要了解上面提到的工具以及代码的含义,请自己另行百度,或者去细看我开篇时给出的文章(里面各种概念说明非常详细)

node服务端搭建学习笔记的更多相关文章

  1. nodejs服务端开发学习笔记

    正在学习中,不断改错... 学习了一段时间nodejs,对其中的很多东西还不是很理解,在网上看过很多的例子,希望通过自己的一些总结让自己了解的更全面些,同时也作为学习笔记留存备忘. 准备工作 node ...

  2. 服务端 | Nodejs 学习笔记(一)

    Node.js 前言: 2009年面世 nodejs.org 官网 https://www.npmjs.com/ 模块社区 github.com 仓库 stackoverflow.com  问答社区 ...

  3. Node服务端极速搭建 - nvmhome

    本文意在让你掌握极速搭建Node服务端(任何Project) $ whoami name: kelvin email: kelvv@outlook.com homepage: www.kelvv.co ...

  4. Node服务端极速搭建 -- nvmhome

    > 本文意在让你掌握极速搭建Node服务端(任何Project) ```$ whoaminame: kelvinemail: kelvv@outlook.comhomepage: www.kel ...

  5. go微服务框架kratos学习笔记七(kratos warden 负载均衡 balancer)

    目录 go微服务框架kratos学习笔记七(kratos warden 负载均衡 balancer) demo demo server demo client 池 dao service p2c ro ...

  6. go微服务框架kratos学习笔记五(kratos 配置中心 paladin config sdk [断剑重铸之日,骑士归来之时])

    目录 go微服务框架kratos学习笔记五(kratos 配置中心 paladin config sdk [断剑重铸之日,骑士归来之时]) 静态配置 flag注入 在线热加载配置 远程配置中心 go微 ...

  7. # go微服务框架kratos学习笔记六(kratos 服务发现 discovery)

    目录 go微服务框架kratos学习笔记六(kratos 服务发现 discovery) http api register 服务注册 fetch 获取实例 fetchs 批量获取实例 polls 批 ...

  8. go微服务框架kratos学习笔记四(kratos warden-quickstart warden-direct方式client调用)

    目录 go微服务框架kratos学习笔记四(kratos warden-quickstart warden-direct方式client调用) warden direct demo-server gr ...

  9. go微服务框架kratos学习笔记九(kratos 全链路追踪 zipkin)

    目录 go微服务框架kratos学习笔记九(kratos 全链路追踪 zipkin) zipkin使用demo 数据持久化 go微服务框架kratos学习笔记九(kratos 全链路追踪 zipkin ...

随机推荐

  1. 抓包工具 - HttpWatch(功能详细介绍)

    HttpWatch是功能强大的网页数据分析工具,集成在IE工具栏,主要功能有网页摘要.cookies管理.缓存管理.消息头发送/接收,字符查询.POST数据.目录管理功能和报告输出.HttpWatch ...

  2. hdu2602 Bone Collector(01背包) 2016-05-24 15:37 57人阅读 评论(0) 收藏

    Bone Collector Problem Description Many years ago , in Teddy's hometown there was a man who was call ...

  3. Hdu3363 Ice-sugar Gourd 2017-01-16 11:39 43人阅读 评论(0) 收藏

    Ice-sugar Gourd Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) ...

  4. OpenGL中位图的操作(glReadPixels,glDrawPixels等)

    OpenGL中位图的操作 OpenGL中位图的操作(glReadPixels,glDrawPixels和glCopyPixels应用举例). 1. BMP文件格式简单介绍 BMP文件是一种像素文件,它 ...

  5. IDEA14添加SVN

    今天升级IDEA14,发现SVN变了,折腾了好一会才搞好.记录一下,希望其他人能少走弯路.主要是IDEA14的svn是用命令行工具进行操作,这样对以后SVN的兼容性也会好很多,这个在他们官方的博客上也 ...

  6. C# 一些代码小结--使用文件记录日志

    C# 一些代码小结--使用文件记录日志 public class FaceLog { public static void AppendInfoLog(string errMsg) { try { s ...

  7. 访问www.baidu.com后会发生什么(一次完整的网络通讯过程)

    1.在浏览器中输入www.baidu.com 这意味着浏览器要向百度发送一个网页数据包,要发送数据包,需要知道对方的IP地址,这里我们只知道网址为www.baidu.com,却不知道IP地址,此时应用 ...

  8. 【wireshark】总体结构

    1. 总体结构 wireshark的总体结构如下图所示. 2. 功能模块 模块名 功能 源码子目录 GTK/Qt 处理所有的用户输入/输出(所有的窗口,对话框等等) /ui GTK: /ui/gtk ...

  9. 一:My Batis快速入门

    ---恢复内容开始--- 一.Mybatis介绍 MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检 ...

  10. klee的docker镜像中没有gcc环境

    sudo apt-get update 密码 klee sudo apt-get install gcc export LD_LIBRARY_PATH=/home/klee/lib/:$LD_LIBR ...