node入门-学习笔记

node入门-学习笔记

node

  • 为什么后端要用node, 因为它是js
  • js运行时环境
  • 主要使用express框架, 能够快速搭建后端服务接口

启动node服务

  • 注意切换目录
  • 创建package.json, npm init -y
  • 安装依赖包 cnpm i -S express body-parser
  • 启动node express-run.js
  • 可以把上面的命令写入package.json,然后npm run start
  • 停止ctrl+C
//package.json
{
  "name": "0",
  "version": "1.0.0",
  "description": "",
  "main": "express-run.js",
  "scripts": {
    "start": "node express-run.js"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": {
    "body-parser": "^1.19.0",
    "express": "^4.17.1"
  }
}
//express-run.js
//加载依赖包
var express = require("express")
var bodyParser = require('body-parser'); //http解析

var app = express();
//跨域处理
var allowCrossDomain = function (req, res, next) {
 res.header('Access-Control-Allow-Origin', '*');
 res.setHeader('Access-Control-Allow-Methods', '*');
 res.setHeader('Access-Control-Allow-Headers', '*');
 next();
};
app.use(allowCrossDomain);

app.use(bodyParser.json()); //解析前端发送的json数据
app.use(bodyParser.urlencoded({extended: true})); //解析前端发表单数据

//定义接口 http://localhost:3000/
app.get("/", function(req, res){
	res.send('index')  //接口返回字符串
})
//启动服务
app.listen(3000, function(){console.log("Server started on port 3000.")});

重构express-run

  • 模块化import/export
  • es6、babel
  • 现在只有一个文件,包装多层套路
  • 功能:访问db,记录日志,方便配置, 方便维护
  • 支持es6语法需要添加.babelrc, 配置babel及模块化支持
  • 添加babel-node,它会在运行时使用.babelrc把代码进行编译
  • cnpm i -S babel-cli babel-preset-env babel-plugin-add-module-exports
  • 根目录添加入口main.js, 从入口运行
  • 需要导出myexpress模块并且把listen方法也要导出到外边去,需要用到promise,与vue相同
  • 若不把listen放到main.js,可能main.js没有执行完就开始监听了。
  • node-promise: bluebird,node8.util.promisify

.babelrc文件:

{
    "presets": ["env"], //解析es6
    "plugins": ["add-module-exports"] //支持export
}

main.js文件

import express from './config/myexpress'

const server = express(); //server.listenAsync  ====  promise
//配置文件处理---取端口号---port
const port = 3000;
//xxxx
//xxxx
//xxxx
server.listenAsync(port).then(()=>{
    console.log("Server started on port 3000.")
})
//package.json
{
  "name": "0",
  "version": "1.0.0",
  "description": "",
  "main": "myexpress.js",
  "scripts": {
    "start": "babel-node main.js"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": {
    "babel-cli": "^6.26.0",
    "babel-node": "^0.0.1-security",
    "babel-plugin-add-module-exports": "^1.0.2",
    "babel-preset-env": "^1.7.0",
    "body-parser": "^1.19.0",
    "express": "^4.17.1"
  }
}

config文件夹下myexpress.js文件:

//导入依赖包
import util from 'util'
import express from 'express'
import bodyParser from 'body-parser'

export default () => {
    var app = express();

    // 使用promise方式将app.listen导出到外边
    app.listenAsync = util.promisify(app.listen); //node8.x提供的

    //跨域处理
    var allowCrossDomain = function (req, res, next) {
        res.header('Access-Control-Allow-Origin', '*');
        res.setHeader('Access-Control-Allow-Methods', '*');
        res.setHeader('Access-Control-Allow-Headers', '*');
        next();
    };
    app.use(allowCrossDomain);

    app.use(bodyParser.json()); //解析前端发送的json数据
    app.use(bodyParser.urlencoded({extended: true})); //解析前端发表单数据

    //定义接口 http://localhost:3000/
    app.get("/", function(req, res){
        res.send('index')  //接口返回字符串
    })
    //启动服务
    //app.listen(3000, function(){console.log("Server started on port 3000.")});
    return app; //返回promise
}

自己模拟接口:(例子)


/**Connect是一个node中间件(middleware)框架。
如果把一个http处理过程比作是污水处理,中间件就像是一层层的过滤网。
每个中间件在http处理过程中通过改写request或(和)response的数据、状态,实现了特定的功能。
中间件就是类似于一个过滤器的东西,在客户端和应用程序之间的一个处理请求和响应的的方法。*/

var connect = require('connect');  //创建连接 
var bodyParser = require('body-parser');   //body解析  用于处理 JSON, Raw, Text 和 URL 编码的数据。
var lists = [];
var index = 1; //id
var arr = [
	[100, 422, 435, 934, 244, 26, 643],
	[324, 663, 300, 934, 325, 325, 626],
	[643, 222, 326, 325, 1290, 2664, 364],
	[2344, 666, 300, 934, 325, 1330, 1320],
	[432, 743, 326, 934, 263, 353, 326]
];

var app = connect()
    .use(bodyParser.json())   //JSON解析
    .use(bodyParser.urlencoded({extended: true}))
	//use()方法还有一个可选的路径字符串,对传入请求的URL的开始匹配。
	//use方法来维护一个中间件队列
	.use(function (req, res, next) {
		//跨域处理
		// Website you wish to allow to connect
        res.setHeader('Access-Control-Allow-Origin', '*');  //允许任何源
        // Request methods you wish to allow
        res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE');  //允许任何方法
        // Request headers you wish to allow
        res.setHeader('Access-Control-Allow-Headers', '*');   //允许任何类型
		res.writeHead(200, {"Content-Type": "text/plain;charset=utf-8"});    //utf-8转码
		next();  //next 方法就是一个递归调用
	})
	.use('/get_table', function(req, res, next) {   //获取全选表格数据
		var data={
                "code": "200",
                "msg": "success",
                "result": [
					{name:'张东阳',sex:'男',city:'香港',check:true,id:1},
					{name:'严雷',sex:'男',city:'北京',check:false},
					{name:'袁彦彦',sex:'女',city:'湖北',check:false},
					{name:'苏方安',sex:'男',city:'广东',check:true},
					{name:'余勇',sex:'男',city:'天津',check:false},
					{name:'许康',sex:'男',city:'上海',check:false},
					{name:'鲁小微',sex:'女',city:'广西',check:false}
				]
            }
            res.end(JSON.stringify(data));
			next();      //
	})
	.use('/get_category', function(req, res, next) {   //获取全选表格数据
		var data={
                "code": "200",
                "msg": "success",
                "result": [{title:'在线咨询',icon:'icon-shenghuo',color:'#f95730'},
				{title:'产品介绍',icon:'icon-11',color:'#fa69b9'},
				{title:'活动动态',icon:'icon-jiazheng',color:'#49dacf'},
				{title:'限时抢购',icon:'icon-jiaoyu',color:'#908cfd'},
				{title:'免费领水果',icon:'icon-jiajujiafang',color:'#92d85c'},
				{title:'红包签到',icon:'icon-peizhi',color:'#ab65ab'},
				{title:'生活服务',icon:'icon-shengji',color:'#ea4952'},
				{title:'充值中心',icon:'icon-xin',color:'#1eb5fb'},
				{title:'美食娱乐',icon:'icon-duankailianjie',color:'#ecbe35'}]
            }
            res.end(JSON.stringify(data));
			next();      //
	})
	.use('/get_tablist', function(req, res, next) {
		var data = {
				"code": "200",
                "msg": "success",
                "result": [
                        {name: '张一',con:'北京'}, 
                        {name: '张二',con:'武汉'}, 
                        {name: '张三',con:'长沙'}, 
                        {name: '张四',con:'南京'}, 
                        {name: '张五',con:'重庆'}]
			}
		res.end(JSON.stringify(data));
		next();
	})
	.use('/tablist', function(req, res, next) {   //获取全选表格数据
		var data={
                "code": "200",
                "msg": "success",
                "result": [{
					date: '2020-03-02',
					name: '张三',
					address: '上海市普陀区金沙江路 1518 号',
					tag: '家'
				  }, {
					date: '2020-03-04',
					name: '李四',
					address: '北京市海淀区苏家坨乡前沙涧村',
					tag: '公司'
				  }, {
					date: '2020-03-01',
					name: '王小虎',
					address: '王府井世都百货 王府井大街99号B3',
					tag: '公司'
				  }, {
					date: '2020-03-13',
					name: '李大虎',
					address: '北京市海淀区首体南路1号 ',
					tag: '家'
				  },
				  {
					date: '2020-03-14',
					name: '周深',
					address: '北京市海淀区买卖街40号 ',
					tag: '公司'
				  },
				  {
					date: '2020-03-11',
					name: '李可爱',
					address: '北京宣武区广安门外大街三义东里东16-2甲8号 ',
					tag: '家'
				  }]
            }
            res.end(JSON.stringify(data));
			next();      //
	})
	.use('/get_chart', function(req, res, next) {   //获取图表数据
		var random = arr[parseInt(Math.random()*arr.length)];
		var data={
                "code": "200",
                "msg": "success",
                "result": random
            }
            res.end(JSON.stringify(data));
			next();  
	})
	.use('/student_location', function(req, res, next) {   //获取全选表格数据
		var data={
                "code": "200",
                "msg": "success",
                "result": [
					{name:'北京',value:1081},
				    {name:'上海',value:400},
				    {name:'湖北',value:280},
				    {name:'广东',value:450},
				    {name:'四川',value:46},
					{name:'黑龙江',value:3},
					{name:'吉林',value:24},
					{name:'辽宁',value:5},
					{name:'内蒙古',value:14},
					{name:'天津',value:26},
					{name:'河北',value:110},
					{name:'山东',value:153},
					{name:'山西',value:35},
					{name:'河南',value:26},
					{name:'江苏',value:436},
					{name:'浙江',value:64},
					{name:'福建',value:226},
					{name:'台湾',value:15},
					{name:'海南',value:54},
					{name:'安徽',value:426},
					{name:'陕西',value:26},
					{name:'重庆',value:150},
					{name:'贵州',value:243},
					{name:'云南',value:16},
					{name:'甘肃',value:2},
					{name:'青海',value:5},
					{name:'西藏',value:11},
					{name:'新疆',value:6}
				]
            }
            res.end(JSON.stringify(data));
			next();      //
	})
	.use('/get_table2', function(req, res, next) {   //获取全选表格数据
		var data={
                "code": "200",
                "msg": "success",
                "result": [
					{data1:576,data2:853,data3:688,data4:589,data5:907,data6:1033,data7:325},
					{data1:635,data2:363,data3:437,data4:659,data5:907,data6:378,data7:378},
					{data1:364,data2:447,data3:543,data4:745,data5:437,data6:1033,data7:325},
					{data1:375,data2:754,data3:754,data4:458,data5:543,data6:464,data7:544},
				]
            }
            res.end(JSON.stringify(data));
			next();      //
	})
	.use('/get_city', function(req, res, next) {   //获取city
		var data={
                "code": "200",
                "msg": "success",
                "result": [
					{
						name: "北京",
						sub: [
							{name: "请选择", sub: []},
							{
								name: "北京",
								sub: [{name: "请选择"}, {name: "东城区"}, {name: "西城区"}, {name: "崇文区"}, {name: "宣武区"}, {name: "朝阳区"}, {name: "海淀区"}, {name: "丰台区"}, {name: "石景山区"}, {name: "房山区"}, {name: "通州区"}, {name: "顺义区"}, {name: "昌平区"}, {name: "大兴区"}, {name: "怀柔区"}, {name: "平谷区"}, {name: "门头沟区"}, {name: "密云县"}, {name: "延庆县"}]
							}]
					},
					{
						name: "广东",
						sub: [
							{name: "请选择", sub: []},
							{
								name: "广州",
								sub: [{name: "请选择"}, {name: "越秀区"}, {name: "荔湾区"}, {name: "海珠区"}, {name: "天河区"}, {name: "白云区"}, {name: "黄埔区"}, {name: "番禺区"}, {name: "花都区"}, {name: "南沙区"}, {name: "萝岗区"}, {name: "增城市"}, {name: "从化市"}]
							},
							{
								name: "深圳",
								sub: [{name: "请选择"}, {name: "福田区"}, {name: "罗湖区"}, {name: "南山区"}, {name: "宝安区"}, {name: "龙岗区"}, {name: "盐田区"}]
							},
							{
								name: "珠海",
								sub: [{name: "请选择"}, {name: "香洲区"}, {name: "斗门区"}, {name: "金湾区"}],
							},
							{
								name: "汕头",
								sub: [{name: "请选择"}, {name: "金平区"}, {name: "濠江区"}, {name: "龙湖区"}, {name: "潮阳区"}, {name: "潮南区"}, {name: "澄海区"}, {name: "南澳县"}]
							}]
					},
					{
						name: "上海",
						sub: [{name: "请选择", sub: []},
							{
								name: "上海",
								sub: [{name: "请选择"}, {name: "黄浦区"}, {name: "卢湾区"}, {name: "徐汇区"}, {name: "长宁区"}, {name: "静安区"}, {name: "普陀区"}, {name: "闸北区"}, {name: "虹口区"}, {name: "杨浦区"}, {name: "宝山区"}, {name: "闵行区"}, {name: "嘉定区"}, {name: "松江区"}, {name: "金山区"}, {name: "青浦区"}, {name: "南汇区"}, {name: "奉贤区"}, {name: "浦东新区"}, {name: "崇明县"}]
							}]
					},
					{
						name: "重庆",
						sub: [{name: "请选择", sub: []},
							{
								name: "重庆",
								sub: [{name: "请选择"}, {name: "渝中区"}, {name: "大渡口区"}, {name: "江北区"}, {name: "南岸区"}, {name: "北碚区"}, {name: "渝北区"}, {name: "巴南区"}, {name: "长寿区"}, {name: "双桥区"}, {name: "沙坪坝区"}, {name: "万盛区"}, {name: "万州区"}, {name: "涪陵区"}, {name: "黔江区"}, {name: "永川区"}, {name: "合川区"}, {name: "江津区"}, {name: "九龙坡区"}, {name: "南川区"}, {name: "綦江县"}, {name: "潼南县"}, {name: "荣昌县"}, {name: "璧山县"}, {name: "大足县"}, {name: "铜梁县"}, {name: "梁平县"}, {name: "开县"}, {name: "忠县"}, {name: "城口县"}, {name: "垫江县"}, {name: "武隆县"}, {name: "丰都县"}, {name: "奉节县"}, {name: "云阳县"}, {name: "巫溪县"}, {name: "巫山县"}, {name: "石柱土家族自治县"}, {name: "秀山土家族苗族自治县"}, {name: "酉阳土家族苗族自治县"}, {name: "彭水苗族土家族自治县"}]
							}]
					},
					{
						name: "湖北",
						sub: [{name: "请选择", sub: []},
							{
								name: "武汉",
								sub: [{name: "请选择"}, {name: "江岸区"}, {name: "武昌区"}, {name: "江汉区"}, {name: "硚口区"}, {name: "汉阳区"}, {name: "青山区"}, {name: "洪山区"}, {name: "东西湖区"}, {name: "汉南区"}, {name: "蔡甸区"}, {name: "江夏区"}, {name: "黄陂区"}, {name: "新洲区"}]
							},
							{
								name: "黄石",
								sub: [{name: "请选择"}, {name: "黄石港区"}, {name: "西塞山区"}, {name: "下陆区"}, {name: "铁山区"}, {name: "大冶市"}, {name: "阳新县"}]
							},
							{
								name: "十堰",
								sub: [{name: "请选择"}, {name: "张湾区"}, {name: "茅箭区"}, {name: "丹江口市"}, {name: "郧县"}, {name: "竹山县"}, {name: "房县"}, {name: "郧西县"}, {name: "竹溪县"}]
							},
							{
								name: "荆州",
								sub: [{name: "请选择"}, {name: "沙市区"}, {name: "荆州区"}, {name: "洪湖市"}, {name: "石首市"}, {name: "松滋市"}, {name: "监利县"}, {name: "公安县"}, {name: "江陵县"}]
							},
							{
								name: "宜昌",
								sub: [{name: "请选择"}, {name: "西陵区"}, {name: "伍家岗区"}, {name: "点军区"}, {name: "猇亭区"}, {name: "夷陵区"}, {name: "宜都市"}, {name: "当阳市"}, {name: "枝江市"}, {name: "秭归县"}, {name: "远安县"}, {name: "兴山县"}, {name: "五峰土家族自治县"}, {name: "长阳土家族自治县"}]
							},
							{
								name: "襄樊",
								sub: [{name: "请选择"}, {name: "襄城区"}, {name: "樊城区"}, {name: "襄阳区"}, {name: "老河口市"}, {name: "枣阳市"}, {name: "宜城市"}, {name: "南漳县"}, {name: "谷城县"}, {name: "保康县"}]
							}]
						}]
            }
            res.end(JSON.stringify(data));
			next();      //
	})
	.use('/get_chart2', function(req, res, next) {   //获取疫情地图数据
		var data={
                "code": "200",
                "msg": "success",
                "result": [
					{
						date:"2020-1-26",
						definite: 769,    //确诊
						distrust: 3806    //疑似
					},
					{
						date:"2020-1-27",
						definite: 1771,
						distrust: 2077
					},
					{
						date:"2020-1-28",
						definite: 1459,
						distrust: 3248
					},
					{
						date:"2020-1-29",
						definite: 1737,
						distrust: 4148
					},
					{
						date:"2020-1-30",
						definite: 1982,
						distrust: 4812
					},
					{
						date:"2020-1-31",
						definite: 2102,
						distrust: 5019
					},
					{
						date:"2020-2-1",
						definite: 2590,
						distrust: 4562
					},
					{
						date:"2020-2-2",
						definite: 2829,
						distrust: 5173
					},
					{
						date:"2020-2-3",
						definite: 3235,
						distrust: 5072
					},
					{
						date:"2020-2-4",
						definite: 3887,
						distrust: 3971
					},
					{
						date:"2020-2-5",
						definite: 3694,
						distrust: 5328
					},
					{
						date:"2020-2-6",
						definite: 3151,
						distrust: 4833
					},
					{
						date:"2020-2-7",
						definite: 3399,
						distrust: 4214
					},
					{
						date:"2020-2-8",
						definite: 2653,
						distrust: 3916
					},
					{
						date:"2020-2-9",
						definite: 3073,
						distrust: 4008
					},
					{
						date:"2020-2-10",
						definite: 2484,
						distrust: 3536
					},
					{
						date:"2020-2-11",
						definite: 2022,
						distrust: 3342
					},
					{
						date:"2020-2-12",
						definite: 15153,
						distrust: 2807
					},
					{
						date:"2020-2-13",
						definite: 5093,
						distrust: 2450
					},
					{
						date:"2020-2-14",
						definite: 2644,
						distrust: 2277
					},
					{
						date:"2020-2-15",
						definite: 2009,
						distrust: 1918
					},
					{
						date:"2020-2-16",
						definite: 2051,
						distrust: 1563
					},
					{
						date:"2020-2-17",
						definite: 1891,
						distrust: 1432
					},
					{
						date:"2020-2-18",
						definite: 1751,
						distrust: 1185
					},
					{
						date:"2020-2-19",
						definite: 825,
						distrust: 1277
					},
					{
						date:"2020-2-20",
						definite: 892,
						distrust: 1614
					},
					{
						date:"2020-2-21",
						definite: 399,
						distrust: 1614
					},
					{
						date:"2020-2-22",
						definite: 649,
						distrust: 882
					},
					{
						date:"2020-2-23",
						definite: 416,
						distrust: 620
					},
				]
            }
            res.end(JSON.stringify(data));
			next();      //
	})
	.use('/get_lists', function(req, res, next) {   //获取图表数据
		var data={
                "code": "200",
                "msg": "success",
                "result": [
					{
						name:'家用电器',
						icon:'icon-shenghuo',
						subItems:[
							{name:'电视'},
							{name:'空调'},
							{name:'洗衣机'},
							{name:'冰箱'}
						]
					},
					{
						name:'电脑/办公',
						icon:'icon-jiajujiafang',
						subItems:[
							{name:'电脑整机'},
							{name:'电脑配件'},
							{name:'外设产品'}
						]
					},
					{
						name:'食品/酒类/生鲜',
						icon:'icon-licai',
						subItems:[
							{name:'新鲜水果'},
							{name:'蔬菜蛋品'},
							{name:'海鲜水产'}
						]
					},
					{
						name:'手机/数码',
						icon:'icon-11',
						subItems:[
							{name:'手机通讯'},
							{name:'运营商'},
							{name:'数码配件'},
							{name:'手机配件'}
						]
					},
					{
						name:'理财/众筹/白条',
						icon:'icon-jiaoyu',
						subItems:[
							{name:'理财'},
							{name:'众筹'},
							{name:'东家'},
							{name:'白条'}
						]
					}
				]
            }
            res.end(JSON.stringify(data));
			next();  
	})
	.use('/form_login', function(req, res, next) {
		var data;
		if(req.method=='POST') {
			if(req.body.mobile=='13987654321'&&req.body.password=='admin123'){
				data = {"code":200,"msg":"success"};
			}else{
				data = {"code":201,"msg":"用户名&密码不匹配"};
			}
			res.end(JSON.stringify(data));
		} else {
			res.end(JSON.stringify({}));
		}
		next();    //
	})
	.use('/form_register', function(req, res, next) {
		var data = {"code":200,"msg":"success"}
		if(req.method=='POST') {
			res.end(JSON.stringify(data));
		} else {
			res.end(JSON.stringify({}));
		}
		next();    //
	})
	.use('/get_login', function(req, res, next) {
		var data;
		if(req.method=='POST') {
			if(req.body.user=='admin123'&&req.body.password=='admin123'){
				data = {"code":200,"msg":"success"};
			}else{
				data = {"code":201,"msg":"用户名&密码不匹配"};
			}
			res.end(JSON.stringify(data));
		} else {
			res.end(JSON.stringify({}));
		}
		next();    //
	})
	.use('/get_nav', function(req, res, next) {
		var data={
			"code": "200",
			"msg": "success",
			"result": [
			  {
				name:'首页',
				icon:'icon-yonghu',
				url:'/index',
				child:[]
			  },
			  {name:'数据统计',
				icon:'icon-jiaoyu',
				url:'/stats',
			  },
			  {name:'信息管理',
				icon:'icon-11',
				url:'/wms',
				child:[
				  {name:'列表展示',url:'/wms/list'}
				]
			  },
			  {name:'用户管理',
				icon:'icon-xin',
				url:'/user',
				child:[
				  {name:'用户统计',url:'/user/stats'},
				  {name:'角色统计',url:'/user/role'}
				]
			  }
		  ]
		}
		res.end(JSON.stringify(data));
		next();
	})
	.use('/list_get', function(req, res, next) {
		var data={
                "code": "200",
                "msg": "success",
                "result": lists
            }
            res.end(JSON.stringify(data));
			next();      //
	})
	.use('/list_add', function(req, res, next) {
		if(req.method=='POST') {
			console.log(req.body.name);
			lists.push({name:req.body.name,state:req.body.state,id:index++});
			console.log(lists);
			var data = {"code":200,"msg":"success"};
			res.end(JSON.stringify(data));
		} else {
			res.end(JSON.stringify({}));
		}
		next();    //
	})
	.use('/list_del', function(req, res, next) {
	
		console.log(req.body.id);
		for(var i=0; i<lists.length;i++){
			if(req.body.id==lists[i].id){
				lists.splice(i,1)
			}
		}
		console.log(lists);
		var data = {"code":200,"msg":"success"};
		res.end(JSON.stringify(data));
		
	})
	.listen(3333);
console.log('Server started on port 3333.');
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值