Node.js学习笔记

146 阅读3分钟

目录

  • 创建第一个Node.js应用
  • Node.js处理get,post请求
  • Node.js初始化路由及接口开发
  • Node.js之增删改查和跨域问题

创建第一个Node.js应用

在我们创建Node.js第一个"Hello, World!"应用前,让我们先了解下Node.js应用是由哪几部分组成的: 引入required模块:我们可以使用require指令来载入Node.js模块。 创建服务器:服务器可以监听客户端的请求,类似于Apache 、Nginx等HTTP服务器。 接收请求与响应请求:服务器很容易创建,客户端可以使用浏览器或终端发送HTTP请求,服务器接收请求后返回响应数据。

  • 步骤一、引入required模块 我们使用require指令来载入http模块,并将实例化的HTTP赋值给变量http,实例如下:
var http=require("http");
  • 创建服务器 接下来我们使用http.createServer()方法创建服务器,并使用listen方法绑定8888端口。 函数通过request, response参数来接收和响应数据。

实例如下,在你项目的根目录下创建一个叫server.js的文件,并写入以下代码:

http.createServer(
	function (request,response){
		// 发送HTTP头部
		// HTTP状态值:200:OK
		// 内容类型:text/plain
		response.writeHead(200,{"Content-Type":"text/plain"});
		//发送响应数据"Hello World!"
		response.end("Hello World!\n");
	}
).listen(8888);

// 终端打印如下信息
console.log("Server running at http://127.0.0.1:8888/");

以上代码我们完成了一个可以工作的HTTP服务器。

  • 使用node命令执行以上的代码:
node server.js
# Server running at http://127.0.0.1:8888/

接下来,打开浏览器访问http://127.0.0.1:8888/你会看到一个写着"Hello World"的网页。

Node.js处理get,post请求

req.method判断请求方式

const http = require("http");
const url = require("url");

const server = http.createServer((req, res) => {
    //判断get还是post请求
    if (req.method == "GET") {
        let getData = url.parse(req.url, true).query;
        // console.log(getData);
        res.end(JSON.stringify(getData));
    } else if (req.method == "POST") {
        let postData = "";
        req.on("data", chunck => {
            postData += chunck;
        })
        req.on("end", () => {
            // console.log(postData);
        })
        res.end(JSON.stringify({
            data: "请求成功!",
            code: 0
        }))
    }
})

server.listen(3000, () => {
    console.log("监听了3000端口...");
})

Node.js初始化路由及接口开发

url.parse(req.url,true).pathname

server.js

const http=require("http")
const url=require("url")
const routerModal=require("../router/index")

const server=http.createServer((req,res)=>{
    // 中文乱码
    res.writeHead(200,{"content-type":"application/json;charset=UTF-8"})
    //调用路由的函数
    let resultData=routerModal(req,res);
    if(resultData){
        // 解析为json数据
        res.end(JSON.stringify(resultData))
    }else{
        // 可以设置404页面为html
        res.writeHead(200,{"content-type":"text/html"})
        res.end("404 not found")
    }
})

server.listen(3000,()=>{
    console.log("监听3000端口...")
})

路由文件.js

const url = require("url")

function handleRequest(req, res) {
    const urlObj = url.parse(req.url, true);
    // 判断接口及请求类型
    if (urlObj.pathname == "/api/getData" && req.method == "GET") {
        return {
            msg: "获取成功"
        }
    } else if (urlObj.pathname == "/api/getPostData" && req.method == "POST") {
        return {
            msg: "获取成功"
        }
    } 
}

module.exports = handleRequest;

注意中文乱码问题,以及404页面自定义

// 中文乱码
res.writeHead(200,{"content-type":"application/json;charset=UTF-8"})
// 可以设置404页面为html
res.writeHead(200,{"content-type":"text/html"})
res.end("404 not found")

Node.js之增删改查和跨域问题

增删改查

server.js

const http = require("http")
const url = require("url")
const routerModal = require("../router/index")

const getPostData = (req) => {
    return new Promise((resolve, reject) => {
        if (req.method != "POST") {
            resolve({})
            return
        }
        let postData = ""
        req.on("data", chunk => {
            postData += chunk;
        })
        req.on("end", () => {
            // console.log(postData)
            resolve(JSON.stringify(postData))
        })
    })
}

const server = http.createServer((req, res) => {
    // 中文乱码
    res.writeHead(200, { "content-type": "application/json;charset=UTF-8" })
    getPostData(req).then((data) => {
        req.body=data;
        //调用路由的函数
        let resultData = routerModal(req, res);
        if (resultData) {
            // 解析为json数据
            res.end(JSON.stringify(resultData))
        } else {
            // 可以设置404页面为html
            res.writeHead(200, { "content-type": "text/html" })
            res.end("404 not found")
        }
    })
})

server.listen(3000, () => {
    console.log("监听3000端口...")
})

router.js

const url = require("url")
const { getUser, addUser, deleteUser, updateUser } = require("../controller/user.js")

function handleRequest(req, res) {
    const urlObj = url.parse(req.url, true);
    console.log(urlObj);
    if (urlObj.pathname == "/api/getUser" && req.method == "GET") {
        let resultData = getUser();
        return resultData;
    } else if (urlObj.pathname == "/api/addUser" && req.method == "POST") {
        let resultData = addUser(req.body);
        return resultData;
    } else if (urlObj.pathname == "/api/deleteUser" && req.method == "POST") {
        let resultData = deleteUser(urlObj.query.id);
        return resultData;
    } else if (urlObj.pathname == "/api/updateUser" && req.method == "POST") {
        let resultData = updateUser(urlObj.query.id,req.body);
        return resultData;
    }
}

module.exports = handleRequest;

controller.js

module.exports={
    getUser(){
        return[
            {
                id:1,
                name:"steven",
                age:24
            }
        ]
    },
    addUser(userObj){
        console.log(userObj);
        return{
            code:0,
            msg:"添加成功",
            data:null
        }
    },
    deleteUser(id){
        console.log(id);
        return{
            code:0,
            msg:"删除成功",
            data:null
        }
    },
    updateUser(id,userObj){
        console.log(id,userObj);
        return{
            code:0,
            msg:"更新成功",
            data:null
        }
    }
}

跨域问题

浏览器同源策略:协议+域名+端口三者相同任一不同就是跨域

// 设置允许跨域的域名,*代表任意域名允许
res.setHeader("Access-Control-Allow-Origin","*");

注意:正式服务器不要用"*",应该用数组形式,否者接口共享

  • 安装中间件(express-generator)
npm install cors -S
  • 引入
const cors=require('cors')
app.use(cors())