NodeJS开发博客(一)
1 区分 ECMAScript/JS/NodeJs
--ECMAScript。定义了语法,写JS和NodeJS都要遵守;
变量定义,循环/判断/函数;
原型和原形链/作用域和闭包/异步
不能操作DOM 不能监听click事件,不能发送ajax请求,不能处理http请求,不能操作文件。
总之,只有ECMAScript 几乎做不了任何实际项目。
-- JS 。使用了 ECMAScript 语法规范,外加 WebAPI 缺一不可。
包含DOM操作 BOM操作 事件绑定 AJAX等
两个结合在能完成浏览器端的操作。
--NodeJS 。 使用了 ECMAScript 语法规范,外加 nodeJS API 缺一不可。
处理http,处理文件等
两者结合,可以完成server端的操作。
2 一个简单get示例

const http = require('http');
const querystring = require('querystring'); //nodejs 自带的模块
const server = http.createServer((req,res)=>{
console.log(req.method); //GET 大写
const url = req.url;
//querystring的作用是把url中的 name=lihua 改成对象的格式
req.query = querystring.parse(url.split('?')[1]);
console.log(JSON.stringify(req.query));
res.end(
//再转成 JSON 格式
JSON.stringify(req.query)
)
})
server.listen(8000);
console.log('ok');
3. 一个简单的 post 请求示例
const http = require('http');
const server = http.createServer((req,res)=>{
if(req.method === 'POST'){
//数据格式
console.log('content-type',req.headers['content-type']);
//接受数据
let postData = "";
req.on('data',chunk => {//post请求 监听数据 类似与水管 数据流的传输
postData += chunk.toString();
})
req.on('end',()=>{
console.log(postData);
res.end('hello world'); //在这里返回,因为是异步
})
}
})
server.listen(8000);
console.log('ok');
使用postman请求post接口:

4. 综合示例
const http = require('http');
const querystring = require('querystring');
const server = http.createServer((req,res)=>{
const method = req.method;
const url = req.url;
const path = url.split('?')[0];
const query = querystring.parse(url.split('?')[1]);
//设置返回格式是 JSON
res.setHeader('Content-type','application/json');
//返回的数据
const resData = {
method,
url,
path,
query
}
//返回
if(method === 'GET'){
res.end(//返回的是json字符串
JSON.stringify(resData)
)
}else if(method === 'POST'){
//接受数据
let postData = "";
req.on('data',chunk => {//post请求 监听数据 类似与水管 数据流的传输
postData += chunk.toString();
})
req.on('end',()=>{
resData.postData = postData;
res.end(
JSON.stringify(resData)
); //在这里返回,因为是异步
})
}
})
server.listen(8000);
console.log('ok');
5 使用nodemon 检测文件变化,自动重启服务器。
6 promise的使用
先编辑三个js文件 :a.js,b.js ,c.js
//a.js
{
"next":'a.json',
"msg":"this is ba"
}
//b.js
{
"next":'b.json',
"msg":"this is b"
}
//c.js
{
"next":null,
"msg":"this is c"
}
对应的index文件:
const fs = require('fs');
const path = require('path');
function getFileContent(fileName,callback){
const fullFileName = path.resolve(__dirname,'files',fileName);
false.readFile(fullFileName,(err,data)=>{
if(err){
console.error(err);
return;
}
callback(
JSON.parse(data.toString())
)
})
}
//测试 callback-hell
getFileContent('a.json',aData=>{
console.log('a data',aData);
getFileContent(aData.next,bData=>{
console.log('b data',bData);
getFileContent(bData.next,cData=>{
console.log('c data',cData);
})
})
})
//使用 promise函数,编写代码,成功执行 resolve,失败执行 reject
function getFileContent(fileName){
const promise = new Promise((resolve,reject)=>{
const fullFileName = path.resolve(__dirname,'file',fileName)
fs.readFile(fullFileName,(err,data) => {
if(err){
reject(err)
return
}
resolve(
JSON.parse(data.toString())
)
})
})
return promise;
}
//使用 promise
getFileContent('a.json').then((aData)=>{
console.log('a data',aData);
return getFileContent(aData.next);
}).then((bData)=>{
console.log('b data',bData);
return getFileContent(bData.next);
}).then((bData)=>{
console.log('c data',cData);
})
=================================
7. 搭建初始环境
对上面4的代码进行了划分:
文件的目录结构如下:

其中 bin/www.js 文件只是设置最基本的http代码:
//基本技术
const http = require('http');
const PROT = 8000;
const serverHandle = require('../app');
const server = http.createServer(serverHandle);
server.listen(PROT)
其中 serverHandle文件相当于 createrServer的回调函数,获取于 app.js:
// 业务代码
const serverHandle = (req,res) =>{
res.setHeader('Content-type','application/json')
const resData = {
name:'lihua',
age:12,
env:process.env.NODE_ENV
}
res.end(
JSON.stringify(resData)
)
}
module.exports = serverHandle
安装 cross-env 和 nodemon 后,package.json文件为:
{
"scripts": {
"dev": "cross-env NODE_ENV=dev nodemon ./bin/www.js",
"prod": "cross-env NODE_ENV=production nodemon ./bin/www.js"
}
}
执行 npm run dev 即可运行;
分析需求 有下面几个接口:

NodeJS开发博客(一)的更多相关文章
- NodeJS开发博客(三) 数据的保存
什么是cookie 存储在浏览器的一段字符串(最大5k) 跨域不共享 格式如 k1=v1 k2=v2 因此可以存储结构化数据 每次发送http请求,会将请求域的cookie一起发送给server se ...
- NodeJS 开发博客(五) 使用express脚手架
1 安装脚手架 npm i express-generator -g 2 使用 express 命令 生成 项目 express-test express express-test 3. npm ...
- NodeJS 开发博客(四) 日志及安全攻击
node 操作文件: const fs = require('fs'); const path = require('path'); const filename = path.resolve(__d ...
- NodeJS开发博客(二) 接入数据库
1. mysql 数据库下载网址:https://dev.mysql.com/downloads/mysql/ 账号是 root 密码是 a1************ 网站账号是邮箱,密码是 Aa1* ...
- 基于 Laravel 开发博客应用系列 —— 设置 Windows 本地开发环境
1.安装原生PHP 下载/解压 PHP 到 PHP 下载页下载最新版本的 PHP(如果使用 Laravel 5.1 的话需要 PHP 5.5.9+ 版本),解压下载的zip格式压缩文件到本地目录,比如 ...
- 基于.NetCore开发博客项目 StarBlog - (5) 开始搭建Web项目
系列文章 基于.NetCore开发博客项目 StarBlog - (1) 为什么需要自己写一个博客? 基于.NetCore开发博客项目 StarBlog - (2) 环境准备和创建项目 基于.NetC ...
- 中文 iOS/Mac 开发博客列表
中文 iOS/Mac 开发博客列表 博客地址 RSS地址 OneV's Den http://onevcat.com/atom.xml 一只魔法师的工坊 http://blog.ibireme.com ...
- 中文 iOS/Mac 开发博客列表(转)
转自https://github.com/tangqiaoboy/iOSBlogCN 中文 iOS/Mac 开发博客列表 本博客列表会不断更新维护,如果有推荐的博客,请到此处提交博客信息. 本博客列表 ...
- 文顶顶iOS开发博客链接整理及部分项目源代码下载
文顶顶iOS开发博客链接整理及部分项目源代码下载 网上的iOS开发的教程很多,但是像cnblogs博主文顶顶的博客这样内容图文并茂,代码齐全,示例经典,原理也有阐述,覆盖面宽广,自成系统的系列教程 ...
随机推荐
- TCP/IP学习笔记10--以太网之基本概念2: 以太网帧格式
"如果错过太阳时你流了泪,那么你也要错过群星了."--- 泰戈尔 前导码(Preamble): 最前面时8个字节的前导码,表示一个以太网帧的开始. 另外,前导码的最后两个比特是&q ...
- [转帖]UCloud上市:利润暴跌84%、成本居高不下,结构化调整迫在眉睫
UCloud上市:利润暴跌84%.成本居高不下,结构化调整迫在眉睫 https://www.iyiou.com/p/116317.html [ 亿欧导读 ] 日前,上交所科创板上市委召开第27 ...
- python 之 前端开发(HTTP协议、head标签、img标签、a标签、列表标签)
第十一章前端开发 11.1 HTTP 1.1引入了许多关键性能优化:keepalive连接,请求流水线,chunked编码传输,字节范围请求等 1.keepalive连接: 1.长连接允许HTTP设备 ...
- Cow Brainiacs
#include<stdio.h> int main() { ,i; scanf("%d %d",&n,&b); ;i<=n;i++) { f*= ...
- Spring Boot的配置文件-yml文件的集合配置方式
yml集合数据的表示方式: 这种方式是配置普通的字符串—— 如果集合中装的是对象,就这么配置—— 行内配置方式—— map的配置方式——
- CentOS7 安装 Git
环境: 系统版本:CentOS 7.5 Git 版本:2.20.1 一.安装 Git 1.下载编译工具 $ yum -y groupinstall "Development Tools&qu ...
- Spring Bean的作用域以及lookup-method标签的使用
Spring Framework支持五种作用域,如下图所示: singleton:表示一个容器中只会存在一个bean实例,无论在多少个其他bean里面依赖singleton bean,整个容器都只会存 ...
- dotnet core2.2 通过虚拟机发布到CentOS上
自从.net core出现的时候,就知道c#的代码居然能后运行到Linux上面,以前都没想过居然这么牛逼,所以很早就想学习怎样部署上去,直到现在.net core都出现2.2了,才花时间去接触,说实话 ...
- python 循环结构(for-in)
循环结构(for-in) 说明:也是循环结构的一种,经常用于遍历字符串.列表,元组,字典等 格式: for x in y: 循环体 执行流程:x依次表示y中的一个元素,遍历完所有元素循环结束 示例1: ...
- JDK反编译的两种方式
环境 链接:https://pan.baidu.com/s/1DwWj5Kt4Gfi68k_EOAea_Q 提取码:57j2 apktools+dex2jar+gd-gui 方式一: apktools ...