1.=>创建配置模块,作用是先判断是开发环境还是生产环境,并将开发或生产环境的数据库信息和http信息分别筛开,便于选择

2.=>创建数据库模块,作用是连接数据库

3.=>创建路由模块,作用是供添加或查找路由

node_demo1过程记录

项目目录结构:
创建manager总项目目录
├ static ┬ index.html
├ css ┬...
├ js ┬...
├ upload ┬...
└ font ┬...
├ libs ┬ database.js //连接数据库
├ http.js //
└ router.js //路由
├config ┬ config.dev.js //开发配置
├ config.prod.js //生产配置
└ index.js

├package.json   //npm init -y  
└server.js

config

开发环境  config.dev.js

const path = require('path');

module.exports={
//database
DB_HOST:'localhost',
DB_PORT:,
DB_USER:'root',
DB_PASS:'',
DB_NAME:'node_sql', //http
HTTP_PORT:,
HTTP_ROOT:path.resolve(__dirname,'../static'),
HTTP_UPLOAD:path.resolve(__dirname,'../static/upload'),
}

生产环境  config.prod.js

module.exports={
//database
DB_HOST:'211.211.211.211',
DB_PORT:,
DB_USER:'root',
DB_PASS:'',
DB_NAME:'node_sql'
}

index.js

const process = require('process');   //process。当前进程的信息,当前程序的信息

// console.log(process.env);   //系统环境信息
// console.log(process.env.OS); //当前系统内核 let mode = (process.env.OS=='Windows_NT'?'dev':'prod');
// 判断是开发环境或生产环境
// console.log(mode); module.exports={
mode,
...(mode=='dev'?require('./config.dev'):require('./config.prod'))
}

libs

数据库文件  database.js

const mysql = require('mysql');
const co = require('co-mysql');
const {DB_HOST,DB_PORT,DB_USER,DB_PASS,DB_NAME}=require('../config'); let conn = mysql.createPool({
host:DB_HOST,
port:DB_PORT,
user:DB_USER,
password:DB_PASS,
database:DB_NAME,
}); module.exports=co(conn);

http.js

const http = require('http');
const url = require('url');
const querystring = require('querystring');
const zlib = require('zlib'); //压缩请求
const fs =require('fs'); //读文件
const router = require('./router'); //路由
// const multiparty = require('multiparty');
const {Form} = require('multiparty'); //主要要用到multiparty里的Form
const {HTTP_PORT,HTTP_ROOT,HTTP_UPLOAD}=require('../config'); http.createServer((req,res)=>{
res.setHeader('content-type','application/json');
res.writeJson = function(json){
res.write(JSON.stringify(json));
} //1.先解析数据
//2.再找路由 //1.
let {pathname,query}=url.parse(req.url,true); if(req.method=='POST'){
if(req.headers['content-type'].startsWith('application/x-www-form-urlencoded')){
//判断头,该处为普通的POST
let arr=[];
req.on('data',buffer=>{
arr.push(buffer);
});
req.on('end',()=>{
let post =querystring.parse(Buffer.concat(arr).toString());
//2.
handle(req.method,pathname,query,post,{}); //拿到post数据,文件数据为空
})
}else{
//这是文件的POST
let form = new Form({
uploadDir:HTTP_UPLOAD //这里是上传文件的地址,
})
form.parse(req);
let post={};
let files={};
form.on('field',(name,value)=>{
post[name]=value;
});
form.on('file',(name,file)=>{
files[name]=file;
})
form.on('error',err=>{
console.log(err);
})
form.on('close',()=>{
//2.
handle(req.method,pathname,query,post,files);
})
}
}else{
//2.
handle(req.method,pathname,query,{},{}); //post和文件都为空
} async function handle(method,url,get,post,files){
let fn = router.findRouter(method,url); if(!fn){
//文件请求
let filepath = HTTP_ROOT+pathname;
fs.stat(filepath,(err,stat)=>{
if(err){
res.writeHeader();
res.write('NOT FOUND');
res.end();
}else{
let rs=fs.createReadStream(filepath);
let gz=zlib.createGzip();
res.on('error',()=>{ })
res.setHeader('content-encoding','gzip');
rs.pipe(gz).pipe(res);
}
})
}else{
//接口
try{
await fn(res,get,post,files);
}catch(e){
res.writeHeader();
res.write('Internal Server Error');
res.end();
}
}
} }).listen(HTTP_PORT,()=>{
console.log(`server ${HTTP_PORT} success`);
});

路由文件  router.js

//路由表
let router={}; function addRouter(method,url,fn){
method = method.toLowerCase();
url = url.toLowerCase(); router[method] = router[method]||{}; //看method是否有东西,有则用,没有则新建一个
router[method][url] = fn;
} function findRouter(method,url){
method = method.toLowerCase();
url = url.toLowerCase(); if(!router[method]||!router[method][url]){
return null; //找不到路由
}else{
return router[method][url];
}
} module.exports={
addRouter,findRouter
};

Server.js

// const config = require('./config'); //它会自动找config目录下的index.js,因而index.js不用写
// const db = require('./libs/database'); // (async ()=>{
// let data = await db.query('SELECT * FROM usertable'); // console.log(data);
// })();
// // 上述代码主要是为了检查是开发环境或是生产环境,进而检查数据库是否连接成功 const db = require('./libs/database');
const http = require('./libs/http');
const {addRouter} = require('./libs/router'); addRouter('get','/list',async(res,get,post,files)=>{
try{
let data = await db.query(`SELECT * FROM usertable`);
res.writeJson({error:,data});
}catch(e){
res.writeJson({error:,msg:'database error'});
} let data=await db.query(`SELECT * FROM usertable`);
res.writeJson({error:,data});
res.end();
}); addRouter('post','/add',async(res,get,post,files)=>{
let {username,password,nickname}=post;
if(!username||!password||!nickname){
res.writeJ({error:,msg:'params invaild'});
}else{
password=Number(password);
if(isNaN(password)){
res.writeJ({error:,msg:'params invaild'});
res.end();
}else{
try{
// db.query(`INSERT INTO usertable (username,password,nickname) VALUES ('{$username}','{$password}','{$nickname}')`);
//安全
await db.query('INSERT INTO usertable (username,password,nickname) VALUES(?,?,?)',[username,password,nickname]);
res.writeJson({error:,msg:'success'})
}catch(e){
res.writeJson({error:,msg:'database error'})
}
}
}
res.end();
}); addRouter('get','/del',async(res,get,post,files)=>{
res.write(get['a']+get['b']);
res.end();
});

Node原生demo的更多相关文章

  1. nodejs,node原生服务器搭建实例

    nodejs,node原生服务器搭建实例

  2. 使用node-gyp编写简单的node原生模块

    通过样例,让我们了解如何编写一个node的原生模块.当然,这篇文章还有一个目的,是为了方便以后编写关于node-gyp的文章,搭建初始环境. 基于node-addon-api 基于node-addon ...

  3. node 发送邮件demo (QQ邮箱)

    nodemailer是nodejs中的邮件发送模块,本文使用的版本为2.5.0 --下载模块 npm install nodemailer npm下载模块后,在项目中引入就可以使用: var node ...

  4. 简单node服务器demo,麻雀虽小,五脏俱全

    //本服务器要实现的功能如下: //1.静态资源服务器(能读取静态资源) //2.能接收get请求,并能处理参数 //3.能接收post请求,并能处理参数 const http = require(' ...

  5. Vue+Iview+Node 登录demo

    1.相关组件安装 axios  iview  js-cookie  crypto-js 2.子父组件传值.监听窗体大小改变.记住密码 .自定义组件(事件 .props) created:实例已经创建完 ...

  6. 瀑布流原生ajax,demo

    最近听朋友们说起瀑布流挺多的,自己就去研究下了,一个简单的原生demo,分享给大家... 简单分为三个文档,有详细的注释 img:ajax.php:demo.php 其中img中放入图片 1.jpg: ...

  7. Node.js原生及Express方法实现注册登录原理

    由于本文只是实现其原理,所以没有使用数据库,只是在js里面模拟数据库,当然是种中还是需要用数据库的. 1.node.js原生方法 ①html页面,非常简单,没有一丝美化~我们叫它user.html & ...

  8. 原生ajax瀑布流demo

    最近听朋友们说起瀑布流挺多的,自己就去研究下了,一个简单的原生demo,分享给大家... 简单分为三个文档,有详细的注释:img:ajax.php:demo.php 其中img文件夹中放入图片 1.j ...

  9. 【译】使用 ndb 调试 node 应用

    原文链接:Debugging Node.js Application Using ndb Google Chrome 实验室发布了一款新的 node debug 工具来提升开发者体验,本文将会全面介绍 ...

随机推荐

  1. [Python自学] day-21 (2) (Cookie、FBV|CBV装饰器)

    一.什么是Cookie 1.什么是Cookie? Cookie是保存在客户端浏览器中的文件,其中记录了服务器让浏览器记录的一些键值对(类似字典). 当Cookie中存在数据时,浏览器在访问网站时会读取 ...

  2. 模板方法(Template Method)---行为型

    1 基础知识 定义:定义了一个算法的骨架并允许子类为一个或多个步骤提供实现.特征:模板方法使得子类可以在不改变算法结构的前提下重新定义某些步骤. 使用场景: (1)需要固定定义算法骨架,实现一个算法的 ...

  3. Java基础知识学习01

    0 项目,包,文件,类 Mytest是自己建的java工程,包含src和JRE System Libery.其中src是存放自己的代码的地方,JRE包含程序运行时所需要的各种文件:在src下包含Tes ...

  4. P2303 [SDOI2012]Longge的问题 我傻QwQ

    莫比乌斯反演学傻了$QwQ$ 思路:推式子? 提交:2次 错因:又双叒叕没开$long\space long$ 题解: $\sum_{i=1}^n gcd(i,n)$ $=\sum_{d|n}d\su ...

  5. effective c++ (四)

    条款10:令operator=返回一个reference to *this 为了实现“连锁赋值”,赋值操作符必须返回一个reference指向操作符的左侧实参,这是你为classes实现赋值操作符时应 ...

  6. vim 自动代码格式调整

    1,gg 跳转到第一行 2,shift+v 转到可视模式 3,shift+g 全选 4,按下神奇的 =

  7. Makefile规则介绍

    Makefile 一个规则 三要素:目标,依赖,命令     目标:依赖 命令 1.第一条规则是用来生成终极目标的规则     如果规则中的依赖不存在,向下寻找其他的规则 更新机制:比较的是目标文件和 ...

  8. codeforces364D

    Ghd CodeForces - 364D John Doe offered his sister Jane Doe find the gcd of some set of numbers a. Gc ...

  9. NIO学习总结

    第一.NIO概述 java.nio 全称 java non-blocking IO,是指 JDK 提供的新 API.从 JDK1.4 开始,Java 提供了一系列改进的输入/输出的新特性,被统称为 N ...

  10. 使用 python 编写一个授权登录验证的模块

    使用 python 编写一个授权登录验证的模块 我们编写的思路: 1.登录的逻辑:如果用户名和密码正确,就返回 token . 2.生成 token 的逻辑,根据用户名,随机数,当前时间 + 2 小时 ...