Node安装
设置全局路径和缓存路径
缓存:npm config set cache “D:\web\Program_Files\nodejs\node_cache”
全局:npm config set prefix “D:\web\Program_Files\nodejs\node_global”
查看结果:npm config ls (-l)
介绍
Nodejs Express是node的web开发框架,它有以下特点:
Unopinionated
不限制应用设计模式(MVC,MVP)
不限制代码规范
不限制功能的选择(是否含View层生成HTML页面)
本教程将演示用express处理GET,POST,PUT,DELETE请求,使用router定义子路由,不涉及数据库
操作
准备工作
创建express项目,初始化一个nodejs项目
mkdir express-hello-world
cd express-hello-world
yarn init -y
yarn add express
code-insiders - //似乎是打开vscode的命令
打开vscode,创建一个app.js文件
// 创建express实例,代表服务器
const express = require("express");
const app = express();
// 设置监听端口
const port = 3000;
// 调用listen方法启动服务器并监听端口,启动成功后打印成功信息
app.listen(port,() => {
console.log(`Express server listening at http://localhost:${port}`);
})
编写完成后,打开终端,输入命令node app.js
启动express服务
启动成功会显示日志Express server listening at http://localhost:3000
locathost代表本机地址,此时express服务虽然已经启动,但它现在并不能任何事情。
如果使用浏览器打开这个网址,会显示cannot GET /
这是因为程序还没处理url
路由和http
请求
处理GET请求
接下来创建一个简单的处理GET请求的程序
// 调用get方法,第一个参数是请求的路径,这里处理根路径的请求
// 第二个参数是处理请求的回调函数,参数分别为请求和响应对象
// 在回调函数里,调用处理请求的send方法,发送响应给客户端
app.get("/",(req,res) => {
res.send("Hello World");
});
此时重启客户端,就可以看到Hello World
处理POST请求
同理,编写一个处理POST请求的方法
// 添加中间件 自定义的 扩展Express功能 请求前、响应前做特定操作
app.use(express.json());
app.post("/",(req,res) => {
console.log("收到请求体:",req.body);
res.status(201).send();
});
使用postman(官网:http://www.postman.com)下载
打开postman(一个处理网页请求的工具),输入我们创建的express服务器地址http://localhost:3000
左边选项选择POST,选择body
,复选框部分选择raw
,下拉菜单选择json
在下面的文本框中编写一条实例对象数据,例如:
{
"name":"Cerelise"
}
接着点击send按钮,稍等一下就可以看到返回的201状态码,可以看到打印出请求体的json数据
处理PUT请求
put用来更新服务器上的资源,需要知道已存在资源的唯一标识,一般是数据库中的id
,
客户端发送put请求时,在url中提供标识参数,然后在express中解析出来,根据标识更新服务器的资源。
调用put方法创建put请求 路径后面的冒号id的意思时根路径后面的值都会作为请求的参数,并且赋值给名为id的变量,比如http://localhost:3000/3
,此时id的值为3
// 打印请求参数的值 req.params.id
// 打印请求体 返回响应,默认是200
app.put("/:id",(req,res) => {
console.log("收到请求参数,id为:",req.params.id);
console.log("收到请求体:",req.body);
res.send();
})
重启服务器,在postman中测试请求
选择PUT,路径可以为http://localhost:3000/3
,填写实例仍是json格式:
{
"name":"Trump"
}
点击发送,可以看到返回了200状态码,再回到终端,可以看到打印出id的值和请求体的json数据
处理DELETE请求
delete用于删除服务器的资源,跟put一样需要唯一标识,这里使用delete方法,最后返回204代码,代表已删除此请求
app.delete("/:id", (req,res) => {
console.log("收到请求参数,id为:",req.params.id);
res.status(204).send();
})
重启服务,使用postman进行测试
复制选项卡,选择DELETE,去掉body(复选框选择none)
然后点击send,看到返回了204状态码
终端也打印出了请求参数
创建路由示例
对于一个express项目,一般会有多组api,比如
文章 /post
产品 /product
订单 /order
然后分配到子路由处理,这里以文章为例模拟一个POST的路由
创建routes文件夹,在里边新建一个post.js文件
我们导入express,创建一个route实例,用于处理子路由。
接下来把app.js的四个请求处理代码复制至post.js,把app改成route,把文字做一些改变
const express = require("express");
const route = express.Router();
// GET请求返回实例数据
route.get("/",(req,res) => {
res.send({ id: 1, title: 'express入门教程·'});
});
// 在POST和PUT请求中把创建和更新后的资源返回给客户端,以便后续使用
app.post("/",(req,res) => {
console.log("保存文章:",req.body);
res.status(201).send({ id:2,...req.body });
});
route.put("/id",(req,res) => {
console.log("收到请求参数,文章id为:",req.params.id);
console.log("收到请求体,新的文章内容为:",req.body);
res.send({id:req.params.id, ...req.body});
})
route.delete("/:id", (req,res) => {
console.log("收到请求参数,文章id为:",req.params.id);
res.status(204).send();
})
// 然后导出子路由变量
module.exports = route;
最后在主路由(app.js)导入它,并挂载到/POST,分配到子路由下
// 创建express实例,代表服务器
const express = require("express");
const app = express();
// 设置监听端口
const port = 3000;
const post = require("./routes/post");
app.use(express.json());
app.use("/post",post)
routes(app);
app.get("/",(req,res) => {
res.send("Hello World");
});
app.post("/",(req,res) => {
console.log("收到请求体:",req.body);
res.status(201).send();
});
app.put("/id",(req,res) => {
console.log("收到请求参数,id为:",req.params.id);
console.log("收到请求体:",req.body);
res.send();
})
app.delete("/:id", (req,res) => {
console.log("收到请求参数,id为:",req.params.id);
res.status(204).send();
})
// 调用listen方法启动服务器并监听端口,启动成功后打印成功信息
app.listen(port,() => {
console.log("Express server listening at http://localhost:${port}");
})
重启服务,再测试一下POST请求
因为项目有多个子路由,为了不使app.js文件过于庞大,可以新建一个index.js,用于统一处理路由的挂载,由它引入子路由,然后导出一个函数,接收app对象,挂载子路由。
const post = require("./post");
moudle.exports = (app) => {
app.use("/post",post);
};
后面只需要在app.js中引入routes文件夹
routes(app);