Linking

Capturing Life & Tech

  • 主页
  • 随笔
  • 关于我
所有文章 外链

Linking

Capturing Life & Tech

  • 主页
  • 随笔
  • 关于我

nodejs学习记录

阅读数:次 2016-01-05
字数统计: 2.2k字   |   阅读时长≈ 9分

《Node.js开发指南》

学习nodejs有一段时间了,基本的概念已经有了大概的了解。《Node.js开发指南》进行到第五章-使用Nodejs进行web开发,实现一个微博系统。
前面看书一直断断续续,前段时间只能晚上在宿舍看一会,没有系统性,虽然勉强看完了前面四章节的基础知识,但还不能说会了。希望通过这个小系统的练习,对nodejs有更深入的理解。

微博系统主要功能

1.路由控制
2.页面模板
3.数据库访问
4.用户注册
5.登陆
6.用户会话

主要技术点:

1.Express框架
2.MVC设计模式
3.ejs模板引擎
4.MongoDB数据库

准备工作

简记 全拼 中文 含义
M Model 模型 对象及数据结构的实现,通常包括数据库操作
V View 视图 表示用户界面,HTML组织结构
C Controller 控制器 用于处理用户请求和数据流、复杂模型,将输出传递给视图

nodejs两大特性,其一:

可以跳过http服务器,因为它本身就是。提供http模块,由c++实现,性能可靠,可直接应用到生产环境。

其二:

与其他语言的显著区别,原始封装成都较低。nodejs中很多工作需要自己完成(但不是都是自己动手,可借助于第三方框架)。

使用http模块

减少一层抽象,性能的提升同时提高了开发难度。就一个简单的post请求来说,PHP只要两行代码,而nodejs需要自己手动写post请求过程。底层接口尽管用起来复杂,但让我们对http协议的理解更加清晰。
http模块是http服务器内核的封装,可以做网站,可以做代理服务器。手动实现所有东西,小到POST请求,达到Cookie、会话管理。当你用这种方式建立网站时,几乎已经做好了一个完整的框架了。

Express框架

更高层的http接口,以及许多网站常用功能实现了。
但不是一个无所不包的全能框架,没有像Rails或Django实现模板引擎甚至ORM(Object Relation Model,对象关系模型)。只是一个轻量级的web框架,多数功能只是对http协议中的常用操作的封装,更多的功能需要插件或者整合其他模块来完成。

快速开始

安装Express
目前express已经更新到4.x版本,安装时可用@加版本

1
2
3
npm install -g express-generator@3
or
npm install -g express-generator@4

书上用的是2.5.8版本,所以

1
npm install -g express@2.5.8 --save

不加版本号,默认最新版本.安装完成后,用express -V检查安装结果。
这样就可以使用express命令了。
最快的安装启动express框架简要步骤:

1
express blog && cd blog && npm install && npm start

express 4.x无法用node app.js启动,指令为npm start。
然后打开localhost:3000即可见到熟悉的Welcome to Express。

对应的版本都需要对应的依赖,有时候安装的时候会自动选择最先版本,也需要最新的依赖;制定的方法是在package.json中制定依赖的版本,再运行npm install来安装依赖。

最重要的事应该是理解框架的设计思想,文件之间的映射关系,各个文件夹的分工。
理解MVC。

老版本用supervisor app.js来启动应用,依然可行。

建立微博网站

1功能分析

开发中的大忌是没想清楚要做什么就开始动手。先应该有一个全局的规划。

  1. 以用户为中心,需有注册登录功能
  2. 最核心的是信息的发表,涉及数据库访问,前端显示
  3. 评论,转发,点赞等功能,但由于学习目的,不一一实现

2路由规划
或者控制器规划是网站的骨架部分,优先考虑
根据功能设计,路由规划方案如下:

  • /: 首页
  • /u[user] 用户主页
  • /post: 发表信息
  • /reg: 用户注册
  • /login: 用户登录
  • /logout: 登出

常见错误处理

在完成用户注册页面书写之后,运行出错。
error:connection strategy not found

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
$ node app.js
E:\sync_mypc\sync_mypc\languages\js\nodejs\blog\mblog\node_modules\connect-mongo
\src\index.js:100
throw new Error('Connection strategy not found');
^

Error: Connection strategy not found
at MongoStore (E:\sync_mypc\sync_mypc\languages\js\nodejs\blog\mblog\node_mo
dules\connect-mongo\src\index.js:100:23)
at HTTPServer.<anonymous> (E:\sync_mypc\sync_mypc\languages\js\nodejs\blog\m
blog\app.js:23:12)
at HTTPServer.app.configure (E:\sync_mypc\sync_mypc\languages\js\nodejs\blog
\mblog\node_modules\express\lib\http.js:542:61)
at Object.<anonymous> (E:\sync_mypc\sync_mypc\languages\js\nodejs\blog\mblog
\app.js:15:5)
at Module._compile (module.js:425:26)
at Object.Module._extensions..js (module.js:432:10)
at Module.load (module.js:356:32)
at Function.Module._load (module.js:311:12)
at Function.Module.runMain (module.js:457:10)
at startup (node.js:136:18)
at node.js:972:3

问题解决
在cnode(已用github邮箱注册)上看到了一篇同样的问题,答案中解决了。
解决方式

1
npm install connect-mongo@0.8.2 --save

独立的模块更新可能影响整体功能。在同一个时期要用当时的版本。

定义的db.js中DEFAULT_PORT没有定义

1
2
3
4
5
6
7
8
9
10
11
12
TypeError: Cannot read property 'DEFAULT_PORT' of undefined
at Object.<anonymous> (E:\sync_mypc\sync_mypc\languages\js\nodejs\blog\mblog\models\db.js:7:74)
at Module._compile (module.js:425:26)
at Object.Module._extensions..js (module.js:432: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:\sync_mypc\sync_mypc\languages\js\nodejs\blog\mblog\models\user.js:1:77)
at Module._compile (module.js:425:26)
at Object.Module._extensions..js (module.js:432:10)
Program node app.js exited with code 1

问题解决

1
DEFAULT_PORT   -----    27017

到今天下午,基本完成第五章的学习。程序能够正常运行,但是还有许多细节不是很清楚,例如mongodb的使用,之间的映射关系自己也还要梳理一遍。

代码稍后会在GitHub和oscGit上双备份。

《Node.js实战》

图书编号:TP312JA425
第一部分 基础篇

nodejs及JavaScript基础了解。
第二部分 提高篇

相册服务器
模块
模板
2015/12/30 noon 17:09 library
稍后补上笔记并上传代码备份

第三部分 实战篇

###第七章使用express构建web应用
路由

1
app.get('/', function(req, res){ });

URL路由函数一般格式

1
app.method(url_pattern, optional_functions, request_handler_function);

method: get, post, delete, put; all
简单的URL

/path/to/resources

也支持正则

/user(s)?/list
/user/*

占位符(用:标记)从请求路由中提取指定值(除了/),解析路由时将匹配到的占位符值保存到req.params对象中

1
2
3
app.get("/albums/:album_name.json", function(req, res){
  res.end("request "+req.params.album_name);
});

如上面请求/albums/linking.json,输出结果为:

request linking

模块化,REST风格的接口。

将能够独立出来,以后会复用的模块分离成单独文件。
模块化增加了源代码可读性,结构更加清晰明了。

中间件

如express就建立在connect这个中间件。

通过一下格式引用中间件

1
2
var middle_something = require('middle_something');
app.use(middle_something());

配置

使用configure方法指定配置名称,在特定的配置环境下该方法提供的函数会被调用。未指定名称,则函数会被所有的配置环境调用,多个配置名称可以用逗号隔开。

1
2
3
4
5
6
7
8
9
10
app.configure(function(){   //全部适用
 app.use(express.bodyParser());
});

app.configure('dev', function(){ //指定了开发环境适用
 app.use(expresss.logger('dev'));
});
app.configure('production', 'staging', function(){ //多名称
 app.use(express.logger());
});

Mac和UNIX电脑中shell命令

1
NODE_ENV=production node program.js

Windows命令

1
2
set NODE_ENV=production
node program.js

中间件执行过程中有一个顺序问题,注意res.end`的位置,它会关闭响应。

静态文件处理

express通过connect提供了static中间件,将存放静态文件的根目录路径名赋给中间件创建函数即可

1
app.use(express.static("/secure/static_site_files"));

bodyParser,cookieParser,session

1
2
3
4
5
6
7
8
9
var app = express()
.use(express.logger('dev'))
// move this to AFTER the next use() and see what happens!
.use(express.bodyParser())
.use(function(req, res){
console.log(req.body);
res.end('want to update album name to '
+ req.body.album.new_name + "\n");
})

编写应用过程中,检测和捕捉错误的代码量往往要大于正常操作的代码量,这才是良好的代码风格。

也许我单纯的以为代码只要能实现直接的功能就行了,是太浅薄的理解。程序中大部分时间都在跟bug作斗争,良好的代码风格能够节省大量的时间,快速定位错误所在。

第四部分 进阶篇

  • 本文作者: Linking
  • 本文链接: https://linking.fun/2016/01/05/nodejs学习记录/
  • 版权声明: 版权所有,转载请注明出处!
  • nodejs
  • cs

扫一扫,分享到微信

判断非手机登陆,做一次提醒
多PC同步测试
  1. 1. 《Node.js开发指南》
    1. 1.1. 准备工作
    2. 1.2. 快速开始
    3. 1.3. 建立微博网站
    4. 1.4. 常见错误处理
  2. 2. 《Node.js实战》
    1. 2.1. 图书编号:TP312JA425第一部分 基础篇
    2. 2.2. nodejs及JavaScript基础了解。第二部分 提高篇
    3. 2.3. 第三部分 实战篇
    4. 2.4. 第四部分 进阶篇
© 2015-2026 Linking
GitHub:hexo-theme-yilia-plus by Litten
本站总访问量次 | 本站访客数人
  • 所有文章
  • 外链

tag:

  • weather
  • 需求
  • essay
  • basketball
  • olympic
  • nginx
  • APPScan
  • SQl盲注
  • xss
  • Ajax
  • ajax
  • ai
  • agent
  • openclaw
  • ccf
  • Nginx
  • HTML5
  • html5
  • hmtl5
  • sse
  • JavaScriptCore
  • Oracle
  • operation
  • Linux
  • deploy
  • Mac Office
  • markdown
  • ListView
  • GridView
  • MySQL
  • 慢查询
  • mongodb
  • 转置
  • thought
  • network
  • ubuntu
  • NetworkManager
  • RFKill
  • Netplan
  • avatar
  • cocoa
  • blog
  • Gitalk
  • container
  • macvlan
  • docker
  • oracle
  • cookie
  • patch
  • gitea
  • git
  • iOS
  • https
  • 多线程
  • bundle
  • 兼容性
  • HTTP
  • 绘图
  • cs
  • java
  • 效率
  • 快捷键
  • route
  • nodejs
  • pip
  • arcgis
  • arcgis 建模
  • 标识
  • redis
  • read
  • bookList
  • running
  • showdoc
  • disk
  • unit-test
  • D.Wade
  • thoughts
  • duoduo
  • Python
  • python
  • tomcat
  • 读书节
  • session
  • jdk
  • war
  • 加班
  • Android onclick事件监听
  • 正则
  • 手机品牌匹配
  • ntp
  • OpenLayers
  • Geoserver
  • wechat
  • 微信公众号
  • 爬虫
  • WeChat
  • 张靓颖
  • 动漫
  • vpn
  • PPT
  • MarkDown
  • plan
  • 朱赟
  • 极客时间专栏
  • 极客邦
  • 模块化
  • MVC
  • excel
  • NBA
  • kobe
  • team
  • crawler
  • 进度条
  • ssl
  • book
  • anti-stealing-link
  • Agentic Engineering
  • Vibe Coding
  • Software 3.0
  • Andrej Karpathy
  • LLM
  • Programming

    缺失模块。
    1、请确保node版本大于6.2
    2、在博客根目录(注意不是yilia-plus根目录)执行以下命令:
    npm i hexo-generator-json-content --save

    3、在根目录_config.yml里添加配置:

      jsonContent:
        meta: false
        pages: false
        posts:
          title: true
          date: true
          path: true
          text: false
          raw: false
          content: false
          slug: false
          updated: false
          comments: false
          link: false
          permalink: false
          excerpt: false
          categories: false
          tags: true
    

  • GitHub Trending
  • OpenAI ChatGPT
  • Gitee码云
  • 简书
  • CSDN