我们这一期做一个简易的http服务器。

先建一个文件夹,就算是一个空的项目了。然后新建app.js和package.json文件。

这样一个简易项目的基本文件就建好了。

通过命令行工具,在项目路径下输入:

E:\project\heron-lesson>npm install express --save

通过npm命令安装最新版的express。我现在的版本是

express@4.12.3 

通过npm install express --save 命令安装的库。会在你的项目里的node_modules文件夹内。同时--save参数会保存项目依赖到package.json文件里。不要忽视package.json文件,他对文件管理起到重要的作用。

回到app.js文件,只需要三行代码,就能完成一个http服务器。

 var express = require('express');
var app = express();
app.listen(3000); // 监听端口3000

推荐使用ide webstorm。授权问题自行百度,你懂的。

直接run app.js

现在这个http服务器占用3000端口,并没有任何的路由,这是我们打开 http://127.0.0.1:3000/ 页面。会看到

Cannot GET /

的提示。

然后我们来编写一个路由

 var express = require('express');

 var app = express();
app.listen(3000); // 监听端口3000 app.get('/', function (req, res) {
return res.send('hello world');
});

rerun app.js

重新访问 http://127.0.0.1:3000/ 页面,就能看到hello world了。

到这里,get请求似乎没有什么问题了。但是如何访问一个页面呢?我们再写一个路由

新建index.html文件在项目根目录。

<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title>Index</title>
</head>
<body>
<h2>Index</h2>
</body>
</html>

再接着编写app.js

 var path = require('path');
var express = require('express'); var app = express();
app.listen(3000); // 监听端口3000 // get: /
app.get('/', function (req, res) {
return res.send('hello world');
});
// get: /index
app.get('/index', function (req, res) {
return res.sendFile(path.join(__dirname, 'index.html'));
});

通过导入path,使用path.join函数 配合__dirname来获取文件路径,我们得到index.html的完整地址。并用res.sendFile函数来发送文件到客户端。访问 http://127.0.0.1:3000/index 页面查看效果。

如果你不理解这些函数的意义,请查阅node的api https://nodejs.org/api/path.html#path_path_join_path1_path2 和expressjs的api http://expressjs.com/4x/api.html

再写一个结合post的路由。由于express4+的版本中不封装post的数据,也没集成相关的库。所以这个东西得另外下载。如法炮制使用npm安装

E:\project\heron-lesson>npm install body-parser --save

新建login.html文件到根目录

<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title></title>
</head>
<body>
<form action="" method="post">
UserName <input type="text" name="userName"/>
Password <input type="password" name="password"/>
<input type="submit"/>
</form>
</body>
</html>

更新app.js代码

 var path = require('path');
var express = require('express')
var bodyParser = require('body-parser'); var app = express();
app.listen(3000); // 监听端口3000 app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true })); // get: /
app.get('/', function (req, res) {
return res.send('hello world');
});
// get: /index
app.get('/index', function (req, res) {
return res.sendFile(path.join(__dirname, 'index.html'));
});
// get: /login
app.get('/login', function (req, res) {
return res.sendFile(path.join(__dirname, 'login.html'));
});
// post: /login
app.post('/login', function (req, res) {
if (req.body.userName === 'admin' && req.body.password === 'password')
return res.send('ok');
else
return res.send('no');
});

至此,简易http服务。正常的get、post请求已经可以处理了。

访问 http://127.0.0.1:3000/login 并输入 admin和password。就能看到ok的提示。

项目地址:demo2

下载后可通过npm install -d 来安装依赖

下一期会讲到如何分离文件,和一些进阶用法。

Node填坑教程——简易http服务器的更多相关文章

  1. Node填坑教程——前言

    Node是什么? Node 是一个服务器端 JavaScript 解释器,它将改变服务器应该如何工作的概念.它的目标是帮助程序员构建高度可伸缩的应用程序,编写能够处理数万条同时连接到一个(只有一个)物 ...

  2. Node填坑教程——HelloWorld

    环境安装(极简): Node需要的环境可以说及其简单,也可以说及其复杂.为什么这么说呢? 如果里只需要运行环境那么到Node官网下载一个包就行了.里面自带npm管理工具,这是包管理工具,以后会频繁的使 ...

  3. Node填坑教程——整理文件

    如果你能把所有代码写进一个文件,并且能很好的管理.协调.多人开发.那么可以跳过这期(请务必带我飞). 我们接着完善上期的代码,给代码分家. node并没有启动入口,更没有固定的项目结构,文件配置.这些 ...

  4. Node填坑教程——过滤器

    所谓“过滤器”,只是一个概念,可以理解是一个路由,也可以理解为一个中间件.原理非常简单,就是利用匹配规则,让其有限匹配在正常的路由前面处理就行了. 比如有如下路由 app.get('/', funct ...

  5. Node填坑教程——常用库

    作为函数式编程来说,流程控制和函数库是必不可少的(应该吧). 下面我们介绍两个常用的库. lodash:完整的api请参阅,https://lodash.com/docs.这里我们只演示几个简单的例子 ...

  6. ReactNative 从环境和第一个demo说起,填坑教程

    一.React-Native MacOS必备环境配置: 1.安装homebrew(这东西可以理解为命令行的app商店) /usr/bin/ruby -e "$(curl -fsSL http ...

  7. backbone新手填坑教程资源

    backbone 入门第二版 http://www.kancloud.cn/kancloud/backbonejs-learning-note/49379 backbone 入门讲解 http://w ...

  8. Vue3+Typescript+Node.js实现微信端公众号H5支付(JSAPI v3)教程--各种填坑

    ----微信支付文档,不得不说,挺乱!(吐槽截止) 功能背景 微信公众号中,点击菜单或者扫码,打开公众号中的H5页面,进行支付. 一.技术栈 前端:Vue:3.0.0,typescript:3.9.3 ...

  9. 即将上线的flume服务器面临的一系列填坑笔记

      即将上线的flume服务器面临的一系列填坑笔记 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.   一.flume缺少依赖包导致启动失败! 报错信息如下: 2018-10-17 ...

随机推荐

  1. 二叉搜索树(Binary Search Tree)--C语言描述(转)

    图解二叉搜索树概念 二叉树呢,其实就是链表的一个二维形式,而二叉搜索树,就是一种特殊的二叉树,这种二叉树有个特点:对任意节点而言,左孩子(当然了,存在的话)的值总是小于本身,而右孩子(存在的话)的值总 ...

  2. JVM可支持的最大线程数(转)

    摘自:http://sesame.iteye.com/blog/622670 工作中碰到过这个问题好几次了,觉得有必要总结一下,所以有了这篇文章,这篇文章分为三个部分:认识问题.分析问题.解决问题. ...

  3. HDU 3729 I&#39;m Telling the Truth(二部图最大匹配+结果输出)

    职务地址:HDU 3729 二分图最大匹配+按字典序输出结果. 仅仅要从数字大的開始匹配就能够保证字典序最大了.群里有人问. . 就顺手写了这题. . 代码例如以下: #include <ios ...

  4. 使用nodeitk进行对象识别

    前言 东莞,晴,29至27度.忙了一天,最终能够写写东西了.今天继续昨天的话题,我们在昨天的例了基础上完好,通过匹配关键点求出映射从而找到场景中的已知对象. 目标 本文你将学习 採用nodeitk的f ...

  5. JavaEE(6) - JMS消息选择和查看

    1. JMS消息的类型.消息头和消息属性 消息类型: StreamMessage MapMessage TextMessage ObjectMessage BytesMessage JMS消息中的消息 ...

  6. boadWorld Mark!

    2014-11-21 xiazaiba.com>jiaocheng>972.html

  7. Delegate,Action,Func,Predicate的使用与区别

    C#4.0推出后,类似Linq,Lamda表达式等许多新的程序写法层次不穷.与之相关的Delegate,Action,Func,Predicate的使用和区别也常常让大家迷惑,此处就结合实际的应用,对 ...

  8. spring data jpa使用懒操作

    如果model对象的某属性使用lazy load,调用这个属性时会报错, failed to lazily initialize a collection of role could not init ...

  9. Javascript闭包的一些研究

    原文:Javascript闭包的一些研究 本文不谈闭包的概念,因为概念容易把人搞晕,本文希望通过几个鲜活的例子来探究闭包的性质,相信对理解闭包会有所帮助. 程序1 var f = (function( ...

  10. 从头开始学JavaScript (十三)——Date类型

    说明:UTC:国际协调日期 GMT:格林尼治标准时间 一.date类型的创建 使用new操作符和Date()构造函数 var now=new Date(): 传入参数:Date.parse()和Dat ...