nodeJS起步 1
nodeJS起步 -- (1)
先来简单介绍nodeJS
我们知道JavaScript是运行在浏览器中的,浏览器为它提供了一个上下文(context),从而让JavaScript得以解析执行。
nodeJS其实可以这么理解,它是另外一种上下文,它允许在后端(脱离浏览器环境)解析执行JavaScript代码。
因为它使用了Google的V8虚拟机(Google的Chrome浏览器使用的上下文环境),所以代码可以同理德被执行。
nodeJS除了可以在浏览器端显示结果之外,还可以直接在控制台输出。
nodeJS的特点
nodeJS主要有非阻塞、基于事件驱动、单进程这几个特点。NodeJS的作者说,他创造NodeJS的目的是为了实现高性能Web服务器,他首先看重的是事件机制和异步IO模型的优越性,而不是JS它更适用于轻量、可伸缩,适于实时数据交互应用。nodeJS内置了很多对象,比如http,fs等,我们可以用它搭建我们的HTTP服务器,在服务器上进行开发。
安装
对于我自己来说,很少进linux去干活,所以目前只有Windows端的安装方式。Linux的安装方式自己网上搜一搜吧..我贴一下别人的
先安装依赖包
sudo apt-get install g++ curl libssl-dev apache2-utils
sudo apt-get install git-core then git clone git://github.com/joyent/node.git
cd node
./configure
make
sudo make install
听说要注意Python版本的问题,建议2.6+的版本,低版本会出现Node安装错误,
查询Python版本可在终端中输入:pyhton -v
Windows下
安装很简单,上官网,把最新版本的msi文件下载下来,直接安装~可以修改路径。
一路下去无阻碍
安装成功之后最新版本的默认已经帮你放进系统路径里边去了,不必管了。
之后可以到开始菜单里边找到nodeJS打开其命令行进入,默认是进入C盘的,一般还是切换到安装路径所在盘,比如我的是E盘
看nodeJS是否安装成功,查看其版本号 node -v
然后简单地测试一下,先输入node命令,然后直接控制台输入console.log("hello");
因为console.log方法实际上是有返回值的,这里没有给他返回,所以第二个就是undefined
再来测试一下,这次我们要看见 Hello World !
在安装路径下(比如我是E:\Program Files\nodejs)新建一个main.js 文件,输入
var http = require('http');
http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Hello World\n');
}).listen(3000, "127.0.0.1");
console.log('Server running at http://127.0.0.1:3000/');
然后在里边输入 node main.js 执行(一般node里边退出就是按一次或两次 Ctrl+C ) ,这时服务器就已经搭建好了~
浏览器中输入其中的地址:http://localhost:3000
我们的Hello World 出来了~
然后先来解释一下这小段代码。
var http = require('http');上面说到了,http是nodeJS里边内置的对象模块,我们使用require这种方式把它引进来(对象模块一般就是这么引入的,我们也可以自己建立自己的模块,然后将它们引入,之后再提到)。
然后http现在这个对象模块有一个方法是,http.createServer(),这个方法创建一个服务之后再监听一个地址:http.createServer().listen(port,ip)
从而搭建了一个服务器。
createServer()里边有一个匿名函数,主要就是用来处理相关信息了。req是请求request,res是回复response。req一般用于请求阶段的解析处理等,比如常见的get中的地址栏url字符的处理。res一般用于收到请求后相应的操作,比如写响应头响应体渲染页面等等。
在这里,res.writeHead(200, {'Content-Type': 'text/plain'});就相当于写了个响应头, res.end('Hello World\n');相当于写了个响应体。
nodeJS提供了很多内置对象方法,比如http,fs,EventEmitter,url等等
这些东西的使用建议参考官方文档
或者taobao建立的平台CNodejs ,去里边逛逛吧
还有这个7天学会nodeJS
基本的HTTP服务器搭建就是这样了,下面介绍node强大的工具npm(node packages manager,包管理工具)。
它主要用于管理我们的包,下载安装包或者卸载包等等。
旧版本的node需要自个去下载安装,不过新版本的已经集成了。所以直接在这里输入npm -v 查看它的版本吧~
npm安装方式一般说来有两种,全局或者本地
好那我们就先来体验下,装个express框架吧。
(express.js是nodejs的一个MVC开发框架,并且支持jade,ejs等多种模板)
我们可以使用两种方式安装:
全局安装:npm install --g express .(我发现--g或者-g皆可)这种方式会把包安装到全局路径里边,一般是C盘的npm/node_modules/下边
哇哦....
不要在意那些错误..
接下来用我想express -V(大写的)查看它的版本吧
有些朋友可能会遇到错误,这里贴个某网友的的~
解决方式如其所说:新版本将命令工具分家了,所以先另外再安装它npm install -g express-generator
我说过了,不要在意上面那些细节..O_O
好了,现在我们来试试express ?
还是那个main.js 我们把它改成这样:
var express = require("express");
//var app = express.createServer(); // 在新版本已经不兼容了,所以直接用下面那个
var app = express(); // 或者直接 var app= require("express")();
var port = 3000;
var ip = "127.0.0.1";
app.listen(port,ip);// ip 这个参数可不写,默认本地 app.get('/',function(req,res){
res.send("Hello World\n");
}); console.log("start express server\n");
如上所示,新版本可能会报错没那个方法
express封装了http,所以可以直接使用它定义的方法了
然后浏览器输入http://localhost:3000/ 又是
然后再来简单介绍上面的代码。其余都不必说了,说一下app.get() 其实这就是一个路由处理。
好那我们来试试路由的处理~
var express = require("express");
//var app = express.createServer(); // 在新版本已经不兼容了,所以直接用下面那个
var app = express(); // 或者直接 var app= require("express")();
var port = 3000;
var ip = "127.0.0.1";
app.listen(port,ip);// ip 这个参数可不写,默认本地 app.get('/',function(req,res){
res.send("Hello World\n");
});
app.get('/one',function(req,res){ // 或者“/one/
res.send("one\n");
});
app.get('/user',function(req,res){ //或者 "/user/"
res.send("user\n");
});
app.get('/user/:id',function(req,res){ //或者 "/user/"
res.send("user: "+req.params.id);
});
console.log("start express server\n");
如上所示,get的第一个参数就是路径地址,第二个参数就是回调函数。
你使用不同的地址路径,就可以进行不同的操作了。
比如浏览器地址的不同可路由:
上头那个user/11中的11就被当做user的参数id值。我们可以通过req.params这个全局方法来获取相应的参数值 req.params.id
对于express,其实有一种更普遍的方法,那就是直接用它来创建一个项目:
比如,我要创建项目express_test 就输入
express -e express_test
好了,项目创建成功,看一下它的结构吧~
项目创建成功之后,生成四个文件夹,主文件app.js与配置信息文件packetage.json
bin是项目的启动文件,配置以什么方式启动项目,默认 npm start
public是项目的静态文件,放置js css img等文件
routes是项目的路由信息文件,控制地址路由
views是视图文件,放置模板文件ejs或jade等(其实就相当于html形式文件啦~)
express这样的MVC框架模式,是一个Web项目的基本构成。
更细的部分先不考虑,我们先来简单地启动吧~
看到没有,第一步出错了,因为它不知道是什么项目,所以要先进入你想要启动的项目。cd express_test
然后又出错了是怎么回事?
看到了吧,它找不到所需模块,所以一般我们创建新项目的时候也要先给他安装相应的模块。
我们直接使用npm install 就行了,它会自动检测package.json文件下载安装相应的模块
好吧,那就启动吧~
ok,启动成功,浏览器输入地址查看一下~
默认端口是3000,可以到bin里边的www文件查看,或者自己修改吧~
哇哦~成功了!简单的express项目就是这样子了..
express模块就先简单地介绍到这来。更多的express后面会继续讲一讲~
最后随手谈一下上面提到的require相关的知识
编写稍大一点的程序时一般都会将代码模块化。在NodeJS中,一般将代码合理拆分到不同的JS文件中,每一个文件就是一个模块,而文件路径就是模块名。
在编写每个模块时,都有require、exports、module三个预先定义好的变量可供使用。
require函数用于在当前模块中加载和使用别的模块,传入一个模块名,返回一个模块导出对象。
模块名可使用相对路径(以./开头),或者是绝对路径(以/或C:之类的盘符开头),模块名中的.js扩展名可以省略。
举个例子:
var express = require("express");
var func1 = require("./func1");// 是与当前main.js同路径下的func1.js模块
var func2 = require("../nodejs/func2");// func2.js则位于与main.js父文件同路径下的
exports对象是当前模块的导出对象,用于导出模块公有方法和属性。
别的模块通过require函数使用当前模块时得到的就是当前模块的exports对象。
比如上面提到的func1.js
我们可以这样写代码然后导出来:
exports.func1 = function(){
console.log("This is func1");
};
/*或者这样
function func1(){
console.log("This is func1");
}
exports.func1 = func1;
*/
module对象可以访问到当前模块的一些相关信息,但最多的用途是替换当前模块的导出对象。
例如模块导出对象默认是一个普通对象,如果想改成一个函数的话,可以使用以下方式。
module.exports = function () {
console.log('Hello World!');
};
这样一来,模块默认导出对象被替换为一个函数。我们在main.js里边就可以直接 var app = require("./func1")(); 操作了
还可以导出一个对象的形式:
//在func1.js里边这样
module.exports = function(name, age) {
this.name = name;
this.age = age;
this.about = function() {
console.log(this.name +' is '+ this.age +' years old');
};
};
//然后在main.js里边这样
var Func1 = require('./func1.js');
var r = new Func1('xiaoming', 12);
r.about(); // xiaoming is 12 years old
-----------好了 以上就是nodeJS的起步,有没有发现,好神奇..--------------
nodeJS起步 1的更多相关文章
- nodejs 笔记
安装环境----------------------------------------------------------------1,安装nodejs 起步------------------- ...
- [NodeJS] Hello World 起步教程
概述: 做数据,免不了需要展示数据,数据可视化是必须经历的步骤. 本文将提供一个NodeJS的起步教程,是笔者这两天探索的小结. 正文: 1. 为什么使用NodeJS 究竟是以B/S还是C/S的架构 ...
- Node.js起步 -- (1)
先来简单介绍nodeJS 我们知道JavaScript是运行在浏览器中的,浏览器为它提供了一个上下文(context),从而让JavaScript得以解析执行. nodeJS其实可以这么理解,它是另外 ...
- 基于NodeJS的全栈式开发
前言 为了解决传统Web开发模式带来的各种问题,我们进行了许多尝试,但由于前/后端的物理鸿沟,尝试的方案都大同小异.痛定思痛,今天我们重新思考了“前后端”的定义,引入前端同学都熟悉的 NodeJS,试 ...
- (转)也谈基于NodeJS的全栈式开发(基于NodeJS的前后端分离)
原文链接:http://ued.taobao.org/blog/2014/04/full-stack-development-with-nodejs/ 随着不同终端(pad/mobile/pc)的兴起 ...
- 也谈基于NodeJS的全栈式开发(基于NodeJS的前后端分离)
前言 为了解决传统Web开发模式带来的各种问题,我们进行了许多尝试,但由于前/后端的物理鸿沟,尝试的方案都大同小异.痛定思痛,今天我们重新思考了“前后端”的定义,引入前端同学都熟悉的NodeJS,试图 ...
- Vue.js 2.x笔记:安装与起步(1)
1. 环境准备 Vue是一套用于构建用户界面的渐进式框架,设计为可以自底向上逐层应用.Vue 的核心库只关注视图层. 安装Node.js,下载:https://nodejs.org/ 查看安装: $ ...
- nodejs基础学习1
ES6常用新语法 ES6新语法 什么是ES6? 由于JavaScript是上个世纪90年代,由Brendan Eich在用了10天左右的时间发明的:虽然语言的设计者很牛逼,但是也扛不住"时间 ...
- 基于NodeJS的全栈式开发(基于NodeJS的前后端分离)
也谈基于NodeJS的全栈式开发(基于NodeJS的前后端分离) 前言 为了解决传统Web开发模式带来的各种问题,我们进行了许多尝试,但由于前/后端的物理鸿沟,尝试的方案都大同小异.痛定思痛,今天我们 ...
随机推荐
- javascript实现函数的默认參数值方法
近期在学python,得益于python中的decorator思路,想到在javascript中參数是不能定义默认值的,可是能够通过decorator给它模拟出来,话不多说,上代码 <!DO ...
- CCProgressTo 和CCProgressTimer
在cocos2d中相同提供了非常多表现图片和精灵的方式,上一篇其中提到的切换场景的方式之中的一个是顺或逆时针切入的方法,在图片上也能够使用,test里有一个样例介绍CCProgressTimer能够实 ...
- Oracle生成查询包括对应于所有数据表记录语句中指定的字段名
应用:已知的字段名,表中的所有数据的查询数据库中包含的所有数据表的字段名 操作方法:指定字段名,用户数据库表,它可以执行以下查询 --Oracle生成查询包括对应于所有数据表记录语句中指定的字段名 d ...
- PHP获取表单方法
php接收HTML当表单提交的信息,数据将存储提交在全局阵列中,我们能够调用系统特定的自己主动全局变量数组来获取这些值.经常使用的自己主动全局变量例如以下所看到的: $_GET $_POST $_RE ...
- js 模块化的规范
The Module Pattern,模块模式,也译为模组模式,是一种通用的对代码进行模块化组织与定义的方式.这里所说的模块(Modules),是指实现某特定功能的一组方法和代码.许多现 ...
- 备注ocp_ORACLE专题网络
声明:原创作品,出自 "深蓝的blog" 博客.欢迎转载.转载时请务必注明出处,否则追究版权法律责任. 深蓝的blog:http://blog.csdn.net/huangyanl ...
- Java Web系列:Spring Boot 基础 (转)
Spring Boot 项目(参考1) 提供了一个类似ASP.NET MVC的默认模板一样的标准样板,直接集成了一系列的组件并使用了默认的配置.使用Spring Boot 不会降低学习成本,甚至增加了 ...
- hdu 3911 Black And White(线段树)
题目连接:hdu 3911 Black And White 题目大意:给定一个序列,然后有M次操作: 0 l r:表示询问l,r中最大连续1的个数 1 l r:表示将l,r区间上的数取反 解题思路:线 ...
- android(9)_数据存储和访问3_scard基本介绍
使用Activity的openFileOutput()保存文件的方法,文件存储在手机空间,通常情况下,手机的存储空间不是很大,存储小文件确定.假设你要存储大文件,如视频,是不可行. 对于这样大的文件, ...
- DirectX 11游戏编程学习笔记2: 文章1章Vector Algebra(向量代数)
本文由哈里_蜘蛛侠原创,转载请注明出处.有问题欢迎联系2024958085@qq.com 注:我给的电子版是700多页.而实体书是800多页,所以我在提到相关概念的时候.会使用章节号而 ...