Nodejs新手村指引——30分钟上手

概要

#准备工作

#开启简单的服务

#路由

#获取参数的三种方式

#静态文件

#数据库集成

#async解决多重嵌套问题

本文适合没有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。

#路由

路由 = 路径 + 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回调,迭代执行完毕或迭代过程发生错误都会触发回调

栗子??

/*#async解决多重嵌套*/
var async = require(‘async‘);
var studentSchema = new mongoose.Schema({
    name: String,
    age: Number
})
var Student = mongoose.model(‘student‘, studentSchema);
var data = [
    new Student({
        name: ‘a‘,
        age: 18
    }),
    new Student({
        name: ‘b‘,
        age: 28
    }),
    new Student({
        name: ‘c‘,
        age: 32
    }),
    new Student({
        name: ‘d‘,
        age: 26
    }),
    new Student({
        name: ‘e‘,
        age: 29
    })
]

async.each(data, function(item, callback){
    item.save(function(err){
        callback(err);
    })
},function(err){
    if(err){
        console.log(err);
    }
    // 没有错误表示数据全部插入完成,可以查询
    Student.find({}, function(err, result){
        if(err){
            return console.log(err);
        }
        console.log(result);
    })
})

查询结果

{ __v: 0, age: 28, name: ‘b‘, _id: 572d965bcd38199a9c3817c3 },
{ __v: 0, age: 18, name: ‘a‘, _id: 572d965bcd38199a9c3817c2 },
{ __v: 0, age: 26, name: ‘d‘, _id: 572d965bcd38199a9c3817c5 },
{ __v: 0, age: 32, name: ‘c‘, _id: 572d965bcd38199a9c3817c4 },
{ __v: 0, age: 29, name: ‘e‘, _id: 572d965bcd38199a9c3817c6 }

有了async.each异步流程控制,告别嵌套,代码看着也舒服。

最后,栗子都在这demo-project

以上是nodejs在新手村最初需要弄明白或者会遇到的一些问题。如果看完有帮助,可以给点鼓励~

作者:王美建
出处:http://www.cnblogs.com/wangmeijian

本文版权归作者和博客园所有,欢迎转载,转载请标明出处。

如果您觉得本篇博文对您有所收获,请点击右下角的 [推荐],谢谢!

时间: 2024-10-11 22:35:31

Nodejs新手村指引——30分钟上手的相关文章

30分钟用 Laravel 实现一个博客

介绍 Laravel 是一款 MVC架构. 目前最流行的 PHP框架. Laravel的优点在于: 丰富的composer类库支持, 优雅的代码, 未来的主流框架(目前市场占有率最高的框架) Laravel的缺点在于: 过于优雅(我们只需要编写极少的代码即可实现功能,意味着底层极其复杂的封装)导致程序的执行效率略低, 和thinkphp等国内主流框架相比,上手难度略高(因为它为我们集成了很多其他的功能,甚至你还需要学习nodeJS相关的知识). 本项目,是完全使用 Laravel框架 内的所提供

es6属性基础教学,30分钟包会

ES6基础智商划重点在实际开发中,ES6已经非常普及了.掌握ES6的知识变成了一种必须.尽管我们在使用时仍然需要经过babel编译. ES6彻底改变了前端的编码风格,可以说对于前端的影响非常巨大.值得高兴的是,如果你熟悉ES5,学习ES6并不需要花费太多的时间就可以掌握,因为常用的基础语法并不多,花少量的时间,就可以开始我们的ES6之旅了. 这篇文章不会详细的告诉你ES6的每一个细节知识,只会根据我自己的开发经验,将我在实际开发中常常用到的知识点分享给大家,给大家学习ES6一个方向的指引.这是因

LaTeX新人教程,30分钟从完全陌生到基本入门

by Nan 对于真心渴望迅速上手LaTeX的人,前言部分可以跳过不看. 本教程面向对LaTeX完全无认知无基础的新人.旨在让新人能够用最简单快捷的方式,轻松入门,能够迅速使用LaTeX完成基本的文本编辑.这个教材最终能够达到的水平是能够使用LaTeX写一篇正常的proposal.如果希望有更大需求的提高,那么推荐在熟悉了这一篇文章的内容之后,再自行google或查阅其他稍厚的教材.尤其旨在破除部分新人对LaTeX在传闻中难以学习的恐惧感.在入门之后,面对各种进阶应用.特殊要求与异常状况,可以自

【转载】【grunt整合版】30分钟学会使用grunt打包前端代码

[grunt整合版]30分钟学会使用grunt打包前端代码 grunt 是一套前端自动化工具,一个基于nodeJs的命令行工具,一般用于:① 压缩文件② 合并文件③ 简单语法检查 对于其他用法,我还不太清楚,我们这里简单介绍下grunt的压缩.合并文件,初学,有误请包涵 准备阶段 1.nodeJs环境 因为grunt是基于nodeJs的,所以首先各位需要安装nodeJS环境,这块我们便不管了http://www.cnblogs.com/yexiaochai/p/3527418.html 2.安装

5分钟上手写ECharts的第一个图表

目录: 前言 简介 方法一:模块化单文件引入(推荐) 方法二:标签式单文件引入 [前言] 最近在捣鼓各种插件各种框架,发现这个ECharts还是比较不错的,文档也挺全的,还是中文的,给大家推荐一下. 这篇文章是零基础入门ECharts图表的教程,先简单介绍一下吧,可能有人还不知道这个东西. [简介] ECharts,缩写来自Enterprise Charts,商业级数据图表,一个纯Javascript的图表库,可以流畅的运行在PC和移动设备上,兼容当前绝大部分浏览器(IE6/7/8/9/10/1

30分钟groovy快速入门并掌握(ubuntu 14.04+IntelliJ 13)

本文适合于不熟悉 Groovy,但想快速轻松地了解其基础知识的 Java开发人员.了解 Groovy 对 Java 语法的简化变形,学习 Groovy 的核心功能,例如本地集合.内置正则表达式和闭包.编写第一个 Groovy 类,然后学习如何使用 JUnit 轻松地进行测试.借助功能完善的 Groovy 开发环境和使用技能,您将轻松完成本教程的学习.最重要的是,您将学会如何在日常 Java 应用程序开发中联合使用 Groovy 和 Java 代码. 阅读本文的前提条件:为了从本教程得到最大收获,

30分钟掌握ES6核心内容

ECMAScript 6(以下简称ES6)是JavaScript语言的下一代标准.因为当前版本的ES6是在2015年发布的,所以又称ECMAScript 2015. 也就是说,ES6就是ES2015. 虽然目前并不是所有浏览器都能兼容ES6全部特性,但越来越多的程序员在实际项目当中已经开始使用ES6了.所以就算你现在不打算使用ES6,但为了看懂别人的你也该懂点ES6的语法了... 在我们正式讲解ES6语法之前,我们得先了解下Babel. Babel Babel是一个广泛使用的ES6转码器,可以将

【C++11】30分钟了解C++11新特性

作者:王选易,出处:http://www.cnblogs.com/neverdie/ 欢迎转载,也请保留这段声明.如果你喜欢这篇文章,请点[推荐].谢谢! 什么是C++11 C++11是曾经被叫做C++0x,是对目前C++语言的扩展和修正,C++11不仅包含核心语言的新机能,而且扩展了C++的标准程序库(STL),并入了大部分的C++ Technical Report 1(TR1)程序库(数学的特殊函数除外). C++11包括大量的新特性:包括lambda表达式,类型推导关键字auto.decl

DAX基础入门 – 30分钟从SQL到DAX — PowerBI 利器

看到漂漂亮亮的PowerBI报表,手痒痒怎么办?! 有没有面对着稀奇古怪的DAX而感到有点丈八金刚摸不着头脑或者干瞪眼?! 有没有想得到某个值想不出来DAX怎么写而直跳脚!? 看完这篇文章,你会恍然大悟,捂脸偷笑.呼呼呼~ 前言: 这篇文章对于具有一点SQL查询基础人会十分容易理解,譬如:掌握SELECT,SUM,GROUP BY等. 注:此文不涉及到Filter Context(筛选上下文)的介绍. 正文: 对于对SQL有一定了解的人来说,咋看DAX,怎么都不习惯. 但是,如果理解以下几个后,