在很多场景中,我们的服务器都需要跟用户的浏览器打交道,如表单提交。
表单提交到服务器一般都使用 GET/POST 请求。
本章节我们将为大家介绍 Node.js GET/POST请求。
Node.js中 GET/POST请求
获取GET请求内容
由于GET请求直接被嵌入在路径中,URL是完整的请求路径,包括了?后面的部分,因此你可以手动解析后面的内容作为GET请求的参数。
node.js 中 url 模块中的 parse 函数提供了这个功能。
实例
var http = require('http');
var url = require('url');
var util = require('util');
http.createServer(function(req, res){
res.writeHead(200, {'Content-Type': 'text/plain; charset=utf-8'});
res.end(util.inspect(url.parse(req.url, true)));
}).listen(3000);
在浏览器中访问 http://localhost:3000/user?name=菜鸟教程&url=www.runoob.com 然后查看返回结果:
获取 URL 的参数
我们可以使用 url.parse 方法来解析 URL 中的参数,代码如下:
实例
var http = require('http');
var url = require('url');
var util = require('util');
http.createServer(function(req, res){
res.writeHead(200, {'Content-Type': 'text/plain'});
// 解析 url 参数
var params = url.parse(req.url, true).query;
res.write("网站名:" + params.name);
res.write("\n");
res.write("网站 URL:" + params.url);
res.end();
}).listen(3000);
在浏览器中访问 http://localhost:3000/user?name=菜鸟教程&url=www.runoob.com 然后查看返回结果:
获取 POST 请求内容
POST 请求的内容全部的都在请求体中,http.ServerRequest 并没有一个属性内容为请求体,原因是等待请求体传输可能是一件耗时的工作。
比如上传文件,而很多时候我们可能并不需要理会请求体的内容,恶意的POST请求会大大消耗服务器的资源,所以 node.js 默认是不会解析请求体的,当你需要的时候,需要手动来做。
基本语法结构说明
var http = require('http');
var querystring = require('querystring');
var util = require('util');
http.createServer(function(req, res){
// 定义了一个post变量,用于暂存请求体的信息
var post = '';
// 通过req的data事件监听函数,每当接受到请求体的数据,就累加到post变量中
req.on('data', function(chunk){
post += chunk;
});
// 在end事件触发后,通过querystring.parse将post解析为真正的POST请求格式,然后向客户端返回。
req.on('end', function(){
post = querystring.parse(post);
res.end(util.inspect(post));
});
}).listen(3000);
以下实例表单通过 POST 提交并输出数据:
实例
var http = require('http');
var querystring = require('querystring');
var postHTML =
'<html><head><meta charset="utf-8"><title>菜鸟教程 Node.js 实例</title></head>' +
'<body>' +
'<form method="post">' +
'网站名: <input name="name"><br>' +
'网站 URL: <input name="url"><br>' +
'<input type="submit">' +
'</form>' +
'</body></html>';
http.createServer(function (req, res) {
var body = "";
req.on('data', function (chunk) {
body += chunk;
});
req.on('end', function () {
// 解析参数
body = querystring.parse(body);
// 设置响应头部信息及编码
res.writeHead(200, {'Content-Type': 'text/html; charset=utf8'});
if(body.name && body.url) { // 输出提交的数据
res.write("网站名:" + body.name);
res.write("<br>");
res.write("网站 URL:" + body.url);
} else { // 输出表单
res.write(postHTML);
}
res.end();
});
}).listen(3000);
执行结果 Gif 演示:
Express中 GET/POST请求
const express = require("express")
const fs = require("fs")
const mysql = require("mysql")
const util = require("util")
const { getNow } = require("./tool")
const app = express();
app.use("/static/", express.static("./static/"));
app.use('/node_modules/', express.static('./node_modules/'));
app.engine("html", require("express-art-template"))
app.use(express.json()) // for parsing application/json
app.use(express.urlencoded({ extended: true })) // for parsing application/x-www-form-urlencoded
// const bodyParser = require("body-parser");
// app.use(bodyParser.urlencoded({ extended: false }))
// app.use(bodyParser.json())
const connection = mysql.createConnection({
host: 'localhost',
user: 'root',
password: '666123',
database: 'vue'
});
connection.connect();
app.use((req, res, next)=>{
req.name = "应用程序级别中间件"
// next({err:'ffff'}) // 传入错误参数 异步错误处理
console.log("应用程序级别中间件");
next();
// 或者 抛出错误 默认只能捕获同步的错误
// thorw new Error("程序执行错误")
// thorw "程序执行错误"
// 或者 代码报错
})
// 渲染页面
app.get("/", (req, res, next) => {
res.render("main.html");
})
app.get("/api/index/", (req, res) => {
res.render("index.html");
})
app.get("/api/test", (req, res) => {
let obj = {
ret: false,
total: 0,
rows: [],
msg: ""
}
console.log(req.query);
// res.header("Access-Control-Allow-Origin", "*");
// res.type('application/json');
// res.jsonp(obj);
res.redirect("/api/index/");
})
// 获取所有数据
app.get("/api/blog_list", (req, res) => {
let obj = {
ret: false,
total: 0,
rows: [],
msg: ""
}
const pageSize = Number(req.query.pageSize);
const pageNumber = Number(req.query.pageNumber) - 1;
connection.query(`SELECT * FROM blog`, (error, results, fields) => {
if (!error) {
obj.total = results.length;
// 分页查询 begin
connection.query(`SELECT * FROM blog limit ${pageNumber * pageSize}, ${pageSize}`, (error, results, fields) => {
if (!error) {
obj.ret = true;
obj.rows = results.map((value, key) => {
return {
id: value.id,
title: value.title,
content: value.content.toString(),
datetime: value.datetime
}
});
res.header("Access-Control-Allow-Origin", "*");
res.type('application/json');
res.jsonp(obj);
} else {
next(error);
}
})
// 分页查询 end
} else {
next(error);
}
})
})
app.get("/api/get_blog_detail", (req, res) => {
let obj = {
ret: false,
content: "",
msg: ""
}
connection.query(`SELECT * FROM blog WHERE ID=${req.query.id}`, (error, results, fields) => {
if (!error) {
obj.ret = true;
obj.content = results[0].content.toString();
res.header("Access-Control-Allow-Origin", "*");
res.type('application/json');
res.jsonp(obj);
} else {
next(error);
}
})
})
app.post("/api/add_blog", (req, res) => {
let obj = {
ret: false,
msg: ""
}
//connection.query(`INSERT INTO users(id, name, sex, city, age) VALUES(NULL, '${req.body.name}', '${req.body.sex}', '${req.body.city}', '${req.body.age}')`, function (error, results, fields) {
connection.query(`INSERT INTO blog(id, title, content, datetime) VALUES(NULL, '${req.body.title}', '${req.body.content}', '${getNow()}')`, function (error, result, fields) {
if (!error) {
obj.ret = true;
obj.msg = "信息添加成功!";
res.header("Access-Control-Allow-Origin", "*");
res.type('application/json');
res.jsonp(obj);
} else {
next(error);
}
})
})
app.post("/api/do", (req, res, next) => {
// res.header("Access-Control-Allow-Origin", "*");
// res.type('application/json');
// res.json(req.body);
// res.send(new Buffer('whoop'));
// res.send({ some: 'json' });
// res.send('<p>some html</p>');
// res.status(404).send('Sorry, we cannot find that!');
// res.cookie('name', 'tobi', { domain: '.example.com', path: '/admin', secure: true });
next("异常测试!");
// res.send({ error: 'something blew up' });
})
app.post("/api/delete_blogs", (req, res) => {
let obj = {
ret: false,
msg: ""
}
var idArr = JSON.parse(req.body.idArr);
for (let i = 0; i < idArr.length; i++) {
connection.query(`DELETE FROM blog WHERE id='${idArr[i]}'`, (error, results, fields) => {
if (!error) {
obj.ret = true;
obj.msg = "删除成功!";
res.header("Access-Control-Allow-Origin", "*");
res.type('application/json');
res.jsonp(obj);
} else {
next(error);
}
})
}
})
app.get("/404", (req, res) => {
res.render("404.html");
})
app.use((req, res, next)=>{
req.name = "应用程序级别中间件"
next({err:'ffff'}) // 传入错误参数 异步错误处理
})
// 配置一个全局错误处理中间件
app.use(function (err, req, res, next) {
console.log(err) // next() 传入的内容
res.status(500).json({
err_code: 500,
message: err
})
})
app.listen(7777, () => {
console.log("服务启动成功......");
})