Nodejs新手村指引——30分钟上手
概要
本文适合没有nodejs项目开发经验而又想对nodejs有个大概了解的你阅读,30分钟上手,也许还不用
*****************************************************
#准备工作
安装好nodejs以后,新建文件夹,起名叫demo-project,在文件夹根目录新建文件app.js作为nodejs应用的入口文件。
打开终端(window上叫命令提示符),进入demo-project根目录,输入以下命令并回车初始化package.json
npm init
命令行会提示你输入项目名称name/版本version/描述description,都使用默认值(直接按回车)就好,输入完description后提示输入应用入口文件名entry point,如果你的入口文件名不叫app.js,输入对应的名称就好,否则一路回车到初始化完成。
初始化完成后demo-project根目录会多出来一个package.json的文件,内容就像这样
{
"name": "node-project",
"version": "1.0.0",
"description": "",
"main": "app.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC"
}
接下来安装express,express是一个基于nodejs平台的web开发框架
npm install express --save
准备工作告一段落。
#开启简单的服务
express开启一个服务非常简单,分三步:引入express=>实例化=>监听端口
var express = require('express'),
app = express(),
PORT = 3000; app.get('/', function(req, res){
res.send('Hello World');
}) app.listen(PORT, function(){
console.log('服务器已经启动~');
})
在终端输入node app.js启动服务
打开浏览器访问:localhost:3000,页面成功打印出Hello World
将app.js中的“Hello World”改成“你好,javascript”,按ctrl+c停止服务然后再输入node app.js(或者直接按方向键⬆)回车重启服务,刷新浏览器,成功打印出“你好,javascript”,为了避免修改一次就重启一次服务这种无聊的事情,需要安装supervisor来监听文件改动自动重启服务
npm install supervisor --save
mac玩家安装失败请尝试在命令前面加sudo以管理员身份安装
sudo npm install supervisor --save
安装完成以后启动服务请使用supervisor app.js命令,它的作用是启动并监听文件状态,发现文件改动立即自动重启服务,不必再使用node app.js。
2016年7月2日补充:supervisor在mac环境使用占用cpu超高,笔记本发烫,推荐使用hotnode,用法一样,比supervisor好一些;
#路由
路由 = 路径 + http方法
路由是由一个路径和特定的http方法构成,每个路由可以对应多个处理函数,基本结构app.METHOD(PATH, HANDLER),app是express的实例,METHOD是http请求方式中的一个,path是服务端路径,HANDLER是路由匹配到时执行的函数
几个路由实例,可以用ajax分别改变请求type对下面三个接口进行验证
app.get('/a', function(req, res){
res.send('这是一个get请求');
})
app.post('/b', function(req, res){
res.send('这是一个post请求');
})
app.delete('/c', function(req, res){
res.send('这是一个delete请求');
})
HANDLER 函数有两个参数req/res,即request/response,请求头和响应头,请求头可以用来获取请求的参数、当前页面的路径等等,响应头可以向页面返回数据或渲染指定页面。
获取参数有三种方式,详见:#参数获取的三种方式
res.render方法指定浏览器渲染的页面,比如写一个访问首页的路由,路径为/,并向首页传递数据{title: '首页'}
在项目根目录下新建文件夹views存放视图,在views下新建index.jade,jade是nodejs的模板引擎,语法非常简练,类似的还有EJS模板
// 指定视图路径和模板引擎jade
var path = require('path');
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');
// 路由
app.get('/', function(req, res){
res.render('index', {
title: '首页'
})
})
index.jade
html
head
title #{title}
body
.content 这里是#{title}
渲染
#获取参数的三种方式
express获取前端传递过来的参数有三种方式
1、通过路径传递,用req.params.key获取
// 路由
app.get('/:name', function(req, res){
console.log(req.params.name)
res.render('index',{
title: '首页'
})
})
// 假如路径是 http://localhost:3000/wangmeijian
// console.log(req.params.name)
// 结果 wangmeijian
2、get方式传递,用req.query.key获取
// 路由
app.get('/', function(req, res){
console.log(req.query.sex)
res.render('index',{
title: '首页'
})
})
// 假如路径是 http://localhost:3000?sex=20
// console.log(req.query.sex)
// 结果 20
3、请求参数只要包含键值对,用req.body获取,借用express官网的例子,app.use是中间件,何谓中间件?就是任何请求都要经过它,它可以修改req和res,可以终止请求,可以调用下一个中间件
var app = require('express')();
// 依赖body-parser和multer来解析参数
var bodyParser = require('body-parser');
var multer = require('multer');
// 中间件
app.use(bodyParser.json()); // for parsing application/json
app.use(bodyParser.urlencoded({ extended: true })); // for parsing application/x-www-form-urlencoded
app.use(multer()); // for parsing multipart/form-data app.post('/', function (req, res) {
console.log(req.body);
res.json(req.body);
})
#静态文件
文件目录
jade模板要引用static目录下单css、js、img等静态资源,需要先通过express.static托管静态资源,express.static是express(4.xx版本)唯一一个内置中间件,其它中间件都需要额外安装
app.use(express.static('static'));
托管之后就可以访问了,注意访问路径不含static
http://localhost:3000/img/a.jpg
http://localhost:3000/css/b.css
http://localhost:3000/js/c.js
#数据库集成
服务端当然要有数据库,nodejs支持多种数据库,比较流行的包括mysql/mongodb,mongodb可以直接以json形式存储数据,mongodb没有表和列的概念,与之对应的是集合和字段
先自行安装mongodb,然后安装mongoose包,mongoose它可以很方便地在nodejs中操作mongodb
npm install mongoose --save
mongoose有三个概念,模式/模型/文档
模式用来定义数据类型
模型是模式编译出来的,可以理解为构造函数
文档是模式的实例,不理解看看栗子就明白了
var mongoose = require('mongoose');
// localhost为mongodb地址,本地安装使用localhost即可,testdb为数据库名称,如果不存在会自动创建
mongoose.connect('mongodb://localhost/testdb',function(err){
if(err){
return console.error(err);
}
console.log('数据库连接成功');
})
// 模式,定义数据类型
var studentSchema = new mongoose.Schema({
name: String,
age: Number
})
// 模型,第一个参数为模型名称,第二个参数为模式名,第三个参数是集合名称,如果不传,mongodb会自动在模型名称后面加s做为集合名
var Student = mongoose.model('student', studentSchema);
// 文档
var student = new Student({
name: '张三',
age: 21
})
// save方法存入数据库
student.save(function(err){
if(err){
return console.log(err)
}
console.log('数据插入成功')
// 模型.find方法查询
Student.find({age: 21},function(err, result){
if(err){
return console.error(err);
}
console.log('查询结果:')
console.log(result)
})
})
#async解决多重嵌套问题
上面的student.save只存入了一次数据然后查询,代码只有一层嵌套,假如有这样一个业务场景,有5条学生信息数据插入数据库,插入完成后立即查询出这5条数据,按上面的写法将会有6层嵌套,嵌套多了,维护是个问题,怎么解决这个问题?
async.each方法解决了这个问题,当然它也需要单独安装,async提供简单而强大的功能来处理javascript异步编程。
npm install async --save
语法:async.each(coll, iteratee, callback),官方文档
coll遍历的集合
iteratee迭代过程
callback回调,迭代执行完毕或迭代过程发生错误都会触发回调
栗子
Nodejs新手村指引——30分钟上手的更多相关文章
- 30分钟用 Laravel 实现一个博客
介绍 Laravel 是一款 MVC架构. 目前最流行的 PHP框架. Laravel的优点在于: 丰富的composer类库支持, 优雅的代码, 未来的主流框架(目前市场占有率最高的框架) Lara ...
- JS组件系列——又一款MVVM组件:Vue(一:30分钟搞定前端增删改查)
前言:关于Vue框架,好几个月之前就听说过,了解一项新技术之后,总是处于观望状态,一直在犹豫要不要系统学习下.正好最近有点空,就去官网了解了下,看上去还不错的一个组件,就抽空研究了下.最近园子里vue ...
- 30分钟groovy快速入门并掌握(ubuntu 14.04+IntelliJ 13)
本文适合于不熟悉 Groovy,但想快速轻松地了解其基础知识的 Java开发人员.了解 Groovy 对 Java 语法的简化变形,学习 Groovy 的核心功能,例如本地集合.内置正则表达式和闭包. ...
- LaTeX新人教程,30分钟从完全陌生到基本入门
by Nan 对于真心渴望迅速上手LaTeX的人,前言部分可以跳过不看. 本教程面向对LaTeX完全无认知无基础的新人.旨在让新人能够用最简单快捷的方式,轻松入门,能够迅速使用LaTeX完成基本的文本 ...
- LaTeX新人30分钟从完全陌生到基本入门
From:http://www.360doc.com/content/13/0117/11/2886802_260681908.shtml 对于真心渴望迅速上手LaTeX的人,前言部分可以跳过不看. ...
- es6属性基础教学,30分钟包会
ES6基础智商划重点在实际开发中,ES6已经非常普及了.掌握ES6的知识变成了一种必须.尽管我们在使用时仍然需要经过babel编译.ES6彻底改变了前端的编码风格,可以说对于前端的影响非常巨大.值得高 ...
- 【微信小程序项目实践总结】30分钟从陌生到熟悉 web app 、native app、hybrid app比较 30分钟ES6从陌生到熟悉 【原创】浅谈内存泄露 HTML5 五子棋 - JS/Canvas 游戏 meta 详解,html5 meta 标签日常设置 C#中回滚TransactionScope的使用方法和原理
[微信小程序项目实践总结]30分钟从陌生到熟悉 前言 我们之前对小程序做了基本学习: 1. 微信小程序开发07-列表页面怎么做 2. 微信小程序开发06-一个业务页面的完成 3. 微信小程序开发05- ...
- 开发Web版一对一远程直播教室只需30分钟 - 使用face2face网络教室
转载自:https://blog.csdn.net/wo_shi_ma_nong/article/details/88110111 在“为网站开发远程直播教室的折腾过程及最终实现”中,介绍了如何使用f ...
- 转:30分钟了解Springboot整合Shiro
引自:30分钟了解Springboot整合Shiro 前言:06年7月的某日,不才创作了一篇题为<30分钟学会如何使用Shiro>的文章.不在意之间居然斩获了22万的阅读量,许多人因此加了 ...
随机推荐
- 洛谷P3227 切糕
最小割模板. 题意:你要在一个三维点阵的每个竖条中删去一个点,使得删去的点权和最小. 且相邻(四联通)的两竖条之间删的点的z坐标之差的绝对值不超过D. 解: 首先把这些都串起来,点边转化,就变成最小割 ...
- sqlserver收缩日志的几种方式
sqlserver收缩日志的几种方式 [sql] --参考 压缩日志及数据库文件大小 /*--特别注意 请按步骤进行,未进行前面的步骤,请不要做后面的步骤 否则可 ...
- 金融量化分析【day110】:Pandas-DataFrame读取与写入
一.DataFrame DataFrame是一个表格型的数据结构,含有一组有序的列 DataFrame可以被看作是有Series组成的字典并且工用一个索引 1.创建方式 pd.DataFrame({' ...
- 深入了解C指针
前言:复杂类型说明 要了解指针,多多少少会出现一些比较复杂的类型,所以我先介绍一下如何完全理解一个复杂类型,要理解复杂类型其实很简单,一个类型里会出现很多运算符,他们也像普通的表达式一样,有优先级 ...
- Lucene6.6.0 案例与学习路线
之前在学习Lucene这个全文检索工具,为项目搜索引擎的开发打下基础.在这里先分享一下关于Lucene的学习心得. 核心的学习流程是:索引文件格式--索引创建过程--检索流程. 1.首先建议参看这篇精 ...
- Codeforces 666 B. World Tour
http://codeforces.com/problemset/problem/666/B 题意: 给定一张边权均为1的有向图,求四个不同的点A,B,C,D,使得dis[A][B]+dis[B][C ...
- 作业:JavaScript(数组篇-poker)给我的徒弟出个题。。。记得早点写完,然后大家3人可以早点打牌了
吐槽一下:“今天实际上我左思右想,写个什么东西好呢!手上的笔转了半天....最后还是给自己留点余地!看着他们什么酒店管理系统,呼叫中心系统之类的....简直是把自己固定死了!感觉一撸到底的感觉!!!我 ...
- CF293B 方格(带技巧的搜索)
solution: 首先我们根据一条路径上不能有两个相同颜色的格子可以得出: 对于两个格子 \((x_1 , y_1 )\) 和 \((x_2 , y_2 )\) 必须满足: \(x_1<x_2 ...
- 工作目录与os.getcwd()
假设某程序在/root/a/aa.py,在shell,当前pwd为/root,输入./a/aa.py运行py程序,则爱程序的工作目录是/root.而不是程序所在文件夹,os.getcwd()就是查看工 ...
- shell-拷贝指定目录外其他全部目录
shopt -s extglob if [ ! -d "desdir" ]; then mkdir desdir fi cp -r Oozie/!(.svn*) desdir/