一、运行js文件
- 新建hello.js,内容如下 ,终端运行程序 node hello.js
//hello.js文件
console.log("Hello World");
二、引入或开放接口模块
- Node.js 提供了
exports
和 require
两个对象
1、提供模块公开接口module.exports
-
exports
:是模块公开的接口
-
module.exports = Hello
决定了外部可以引用该模块,其接口对象就是输出的Hello对象本身
//hello.js 文件
function Hello() {
var name;
this.setName = function(thyName) {
name = thyName;
};
this.sayHello = function() {
console.log('Hello ' + name);
};
};
module.exports = Hello;
2、引入模块require
-
require
:用于从外部获取一个模块的接口,比如用来载入 Node.js 模块或者已经exports了的本地的js文件。简单说:require 用来加载一个文件的,可加载 .js、.json 和 .node 后缀的文件
-
require('./hello')
引入了当前目录下的 hello.js 文件(./ 为当前目录,node.js 默认后缀为 js)
//server.js文件
var Hello = require('./hello');
hello = new Hello();
hello.setName('BYVoid');
hello.sayHello();
三、GET/POST请求
1、获取GET请求内容
- 运行如下文件node server.js,并在浏览器中输入http://localhost:3000/user?name=Nodejs_learning_website&url=https://www.runoob.com/nodejs/node-js-get-post.html
-
通过res.write()和res.end()即可了解对应的响应内容
即可看到get请求对应的响应的内容
//server.js文件
var http = require('http'); //请求(require)Node.js 自带的 http 模块,并且把它赋值给 http 变量
var url = require('url');
var util = require('util');
/*
1、http.createServer() 方法创建服务器,并使用 isten方法指定这个 HTTP 服务器监听的端口号
2、http.createServer() 的参数为一个匿名函数, 该匿名函数通过 req, res 参数来接收和响应数据
*/
http.createServer(function(req, res){
// 定义响应头
res.writeHead(200, {'Content-Type': 'text/html; charset=utf8'});
// 解析请求的url的query参数
var params = url.parse(req.url, true).query;
// res.write定义响应内容
res.write("website_name is:" + params.name);
res.write("\n");
res.write("website URL is:" + params.url);
res.write("\n");
// 响应会返回前面res.write()的内容,并最终会返回res.end()出来的内容, res.end()也可传空置
res.end(util.inspect(url.parse(req.url, true))); //util.inspect(url.parse(req.url, true))
}).listen(3000);
console.log('Server running at http://127.0.0.1:3000/');
2、获取Post请求内容
- POST 请求的内容全部的都在请求体中,http.ServerRequest 并没有一个属性内容为请求体,原因是等待请求体传输可能是一件耗时的工作。
- 比如上传文件,而很多时候我们可能并不需要理会请求体的内容,恶意的POST请求会大大消耗服务器的资源,所以 node.js 默认是不会解析请求体的,当你需要的时候,需要手动来做。
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) {
// 定义了一个body变量,用于暂存请求体的信息
var body = "";
// 通过req的data事件监听函数,每当接受到请求体的数据,就累加到body变量中
req.on('data', function (chunk) {body += chunk;});
req.on('end', function () {
// 在end事件触发后,通过querystring.parse将body变量解析为真正的POST请求格式,然后向客户端返回
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);
console.log('Server running at http://127.0.0.1:3000/');
四、创建Web服务器/客户端
- Node.js 提供了 http 模块,http 模块主要用于搭建 HTTP 服务端和客户端,使用 HTTP 服务器或客户端功能必须调用 http 模块
- Client - 客户端,一般指浏览器,浏览器可以通过 HTTP 协议向服务器请求数据
- Server - 服务端,一般指 Web 服务器,可以接收客户端请求,并向客户端发送响应数据
1、 Node 创建 Web 服务器
// server.js
var http = require('http');
var fs = require('fs');
var url = require('url');
// 创建服务器
http.createServer( function (request, response) {
// 解析请求,包括文件名
var pathname = url.parse(request.url).pathname;
// 输出请求的文件名
console.log("Request for " + pathname + " received.");
// 从文件系统中读取请求的文件内容
fs.readFile(pathname.substr(1), function (err, data) {
if (err) {
console.log(err);
// HTTP 状态码: 404 : NOT FOUND Content Type: text/html
response.writeHead(404, {'Content-Type': 'text/html'});
}else{
// HTTP 状态码: 200 : OK Content Type: text/html
response.writeHead(200, {'Content-Type': 'text/html'});
// 响应文件内容
response.write(data.toString());
}
// 发送响应数据
response.end();
});
}).listen(8080);
// 控制台会输出以下信息
console.log('Server running at http://127.0.0.1:8080/');
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>教程(oob.com)</title>
</head>
<body>
<h1>我的第一个标题</h1>
<p>我的第一个段落。</p>
</body>
</html>
- 运行server.js文件,在浏览器输入
http://127.0.0.1:8080/index.html
, 即可看到index.html返回的内容
2、 使用 Node 创建 Web 客户端
- 新建client.js如下,前提:前面服务端sever.js正在运行,且浏览器已输入http://127.0.0.1:8080/index.html;新开窗口运行client.js则会打印出服务端index.html的源代码;
- 额,我觉得该脚本更像一个爬虫程序~,请求数据,然后获得源代码响应
// client.js
var http = require('http');
// 用于请求的选项
var options = {
host: 'localhost',
port: '8080',
path: '/index.html'
};
// 处理响应的回调函数
var callback = function(response){
// 不断更新数据
var body = '';
response.on('data', function(data) {body += data;});
response.on('end', function() {console.log(body); // 数据接收完成});
}
// 向服务端发送请求
var req = http.request(options, callback);
req.end();
五、Express 框架
- Express 是一个简洁而灵活的 node.js Web应用框架, 提供了一系列强大特性帮助你创建各种 Web 应用,和丰富的 HTTP 工具
- 使用 Express 可以快速地搭建一个完整功能的网站
- Express 框架核心特性:可以设置中间件来响应 HTTP 请求,定义了路由表用于执行不同的 HTTP 请求动作, 可以通过向模板传递参数来动态渲染 HTML 页面
- Express框架学习
1、安装express
-
body-parser
:node.js 中间件,用于处理 JSON, Raw, Text 和 URL 编码的数据
-
cookie-parser
:这就是一个解析Cookie的工具。通过req.cookies可以取到传过来的cookie,并把它们转成对象
-
multer
:node.js 中间件,用于处理 enctype=“multipart/form-data”(设置表单的MIME编码)的表单数据
-
npm list express
最终能看到express框架的版本
npm init -f
npm install express --save
npm install body-parser --save
npm install cookie-parser --save
npm install multer --save
npm list express
2、express简单案例
- 主要使用的路由规则是get和post两种
- 以下脚本生成一个 express 实例 app,挂载了一个根路由控制器,然后监听 8082端口并启动程序,可看到对应输出
- 代码注解:访问根路径时,依然返回Hello Get ;访问路径:name占位符;以及访问正则匹配的路径
//express_demo.js 文件
var express = require('express');
var app = express();
/*
访问根路径时,依然返回Hello Get
当访问如http://127.0.0.1:8082/users/nbdh路径时,返回 hello, nbdh
路径中 :name 起了占位符的作用,这个占位符的名字是 name,可以通过 req.params.name 取到实际的值
*/
// 访问 http://127.0.0.1:8082/
app.get('/', function (req, res) {
res.send('Hello Get');
})
// 访问 http://127.0.0.1:8082/users/nbdh 页面 GET 请求
app.get('/users/:name', function (req, res) {
res.send('hello, ' + req.params.name)
})
// 对页面 http://127.0.0.1:8082/name=abx123cd等响应 GET 请求
app.get('/name=ab*cd', function(req, res) {
console.log(req.params)
res.send('正则匹配');
})
// post请求
app.post('/', function (req, res) {
res.send('Hello POST');
})
//监听8082端口
var server = app.listen(8082);
3、Python使用nodejs运行js脚本
- 第一步:在当前目录下创建LJ.js文件,该文件是逆向扣出来的js脚本,关键代码如下,一定要提供导出模块接口
module.exports = req
,调用该js文件需要传入两个参数lat_lng, num ,最后返回get_max_min函数的结果
req = function(lat_lng, num){
c = Wa(lat_lng);
// console.log(get_max_min(c, num))
return get_max_min(c, num)
}
module.exports = req
- 第二步:在同一目录下创建
LJserver.js
文件如下,运行该文件,在浏览器输入http://127.0.0.1:8082/get_LJ_latlng?lng=120.5811424828&lat=31.3010678543&Se=inner&num=12
,即可返回上面LJ.js的结果; 这其实就是浏览器请求数据,nodejs的服务作为响应返回了结果这么一个过程;
//LJserver.js文件
var Ljresp = require('./LJ.js')
// express应用
var express = require('express');
var app = express();
var bodyParser = require('body-parser');
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended: true}));
// lat_lng的js文件请求: http://127.0.0.1:8082/get_LJ_latlng?lng=120.5811424828&lat=31.3010678543&Se=inner&num=12
app.get("/get_LJ_latlng",function(req,res){
var lat_lng = {
"lng": req.query.lng,
"lat":req.query.lat,
"Se": "inner"
};
res.send(Ljresp(lat_lng, req.query.num));
});
//监听8082端口
const server = app.listen(8082);
- 第三步:Python脚本请求js服务的结果,前面的LJserver.js在运行状态下
import requests
from urllib.parse import urlencode
lat_lng = {
"lng": 120.5811424828,
"lat": 31.3010678543,
"Se": "inner",
"num": 12
}
url = f"http://127.0.0.1:8082/get_LJ_latlng?{urlencode(lat_lng)}"
print(url)
resp = requests.get(url, timeout=10)
print(resp.json())
# 最终输出结果如下
# http://127.0.0.1:8082/get_LJ_latlng?lng=120.5811424828&lat=31.3010678543&Se=inner&num=12
# {'maxLatitude': 31.532069843198276, 'minLatitude': 31.069492306296034, 'maxLongitude': 120.91171891047182, 'minLongitude': 120.25056605512805}