共计 2230 个字符,预计需要花费 6 分钟才能阅读完成。
处理 GET 或 POST 请求发送的数据
处理 GET 请求
server 中的 request.url 会把查询字符串也带过来解决方法:使用 url 库解析,这样 pathname 就是查询字符串前面的字符串,url 库可以对 url 进行一些处理,可以取一些主机名,协议之类的数据
例如我们接下来将查询字符串解析为键值对的形式:
server.js 将解析过后的 params 一层层传到 handle 里,然后处理交给 /api/v1/records 这条路来处理:直接将这个 json 字符串转化为对象相应给前端结果:var params = url.parse(request.url, true).query; 中 true 这个参数代表返回一个 JSON 对象形式的字符串(本质上是一个字符串),如果是 false, 就直接返回完整的查询字符串:如下
处理 POST
在 index.html 建一个简单的表单发送 post 请求先进入 index.html,再通过表单进入
<form action=”/api/v1/records” method=”post”>
name: <input type=”text” name=”name” /> age: <input type=”text” name=”age” />
<input type=”submit” value=”Submit”>
</form>
注意:url 库只能解析 get 发送的请求修改代码:
var http = require(‘http’);
var fs = require(‘fs’);
var url = require(“url”)
var querystring = require(“querystring”)//querystring 用来将 post 请求中的数据解析为对象
function startServer(route, handle) {
var onRequest = function(request, response) {
var pathname = url.parse(request.url).pathname
console.log(‘Request received ‘ + pathname);
var data = ”
request.on(‘error’,function(err){
console.error(err)
}).on(‘data’,function(chunk){
data+=chunk
}).on(‘end’,function(){
if(request.method === “POST”) {// 如果是 post 请求,就这样处理,还是那传过来的数据都转化为对象,再丢给 handle
route(handle, pathname, response, querystring.parse(data));// 这里将 post 请求发送来的数据解析为 json 对象的形式
}else if(request.method === “GET”){// 如果是 get 请求
var params = url.parse(request.url, true).query;// 转化为一个 json 对象(本质上是对象)
route(handle, pathname, response, params);// 拿到查询字符串
}
})
}
var server = http.createServer(onRequest);
server.listen(3000, ‘127.0.0.1’);
console.log(‘Server started on localhost port 3000’);
}
module.exports.startServer = startServer;
post 和 get 请求都 ok
优化一下程序:
var http = require(‘http’);
var fs = require(‘fs’);
var url = require(‘url’);
var querystring = require(‘querystring’);
function startServer(route, handle) {
var onRequest = function(request, response) {
var pathname = url.parse(request.url).pathname;
console.log(‘Request received ‘ + pathname);
var data = [];// 将 data 声明为数组,
request.on(“error”, function(err) {
console.error(err);
}).on(“data”, function(chunk) {
data.push(chunk);//
}).on(‘end’, function() {
if (request.method === “POST”) {
if (data.length > 1e6) {// 判断长度,及时取消响应
request.connection.destroy();
}
data = Buffer.concat(data).toString();// 使用流
route(handle, pathname, response, querystring.parse(data));
} else {
var params = url.parse(request.url, true).query;
route(handle, pathname, response, params);
}
});
}
if (data.length > 1e6) 科学计数法,如果数据量很大,就把请求取消,不然会增加服务器的负载,使服务器宕机