2019年10月04日16:56:23

7. 模块

7.1 暴露一个类,字段
var bar = require("./bar.js");
var msg = "你好";
var info = "呵呵"; function showInfo(){
console.log(info);
} exports.msg = msg;
exports.info = info;
exports.showInfo = showInfo;
function People(name,sex,age){
this.name = name;
this.sex = sex;
this.age = age;
} People.prototype = {
sayHello : function(){
console.log(this.name + this.sex + this.age);
}
} //此时,People就被视为构造函数,可以用new来实例化了。
module.exports = People;
var People = require("./test/People.js");
var xiaoming = new People("小明","男","12");
xiaoming.sayHello();

也就是说,js文件和js文件之间有两种合作的模式:

1) 某一个js文件中,提供了函数,供别人使用。 只需要暴露函数就行了; exports.msg=msg;

2) 某一个js文件,描述了一个类。 module.exports = People;

7.2 package.json

每一个模块文件夹中,推荐都写一个package.json文件,这个文件的名字不能改。node将自动读取里面的配置。有一个main项,就是入口文件:

1{
2 "name": "kaoladebar",
3 "version": "1.0.1",
4 "main" : "app.js"
5}

package.json文件,要放到模块文件夹的根目录去。

7.3 __dirname 绝对路径

新建个文件

app.js

里面的内容如下:

console.log(__dirname + '/example.db');
console.log('example.db');

如果将app.js放在一个根目录下面

执行node app.js

分别输出如下内容:

/Users/durban/nodejs/koa-mysql-orm-model/example.db
example.db

我们建立一个文件夹app,app下建立一个app.js

里面的内容如下:

console.log(__dirname + '/example.db');
console.log('example.db');

执行node app.js

分别输出如下内容:

/Users/durban/nodejs/koa-mysql-orm-model/app/example.db
example.db

可见,__dirname追加了自身的目录路径,一般这样做的好处是,可以避免文件的混乱调用。

8.post请求

8.1 原生的post请求

把post请求的数据分成一块一块的拼接再返回。

注意:原生写post请求比较复杂,需要写两个监听,并且上传图片等不能实现。

var http = require("http");
var querystring = require("querystring"); //创建服务器
var server = http.createServer(function(req,res){
//如果你的访问地址是这个,并且请求类型是post
if(req.url == "/dopost" && req.method.toLowerCase() == "post"){
var alldata = "";
//下面是post请求接收的一个公式
//node为了追求极致,它是一个小段一个小段接收的。
//接受了一小段,可能就给别人去服务了。防止一个过大的表单阻塞了整个进程
req.addListener("data",function(chunk){
alldata += chunk;
});
//全部传输完毕
req.addListener("end",function(){
var datastring = alldata.toString();
res.end("success");
//将datastring转为一个对象
var dataObj = querystring.parse(datastring);
console.log(dataObj);
console.log(dataObj.name);
console.log(dataObj.sex);
});
}
}); server.listen(80,"127.0.0.1");
8.2 formidable模块

上传图片文件等不能忘记这一行代码

enctype="multipart/form-data"

var util = require("util");

//创建服务器
var server = http.createServer(function(req,res){
//如果你的访问地址是这个,并且请求类型是post
if(req.url == "/dopost" && req.method.toLowerCase() == "post"){
//Creates a new incoming form. var form = new formidable.IncomingForm();
//设置文件上传存放地址
form.uploadDir = "./uploads"; //执行里面的回调函数的时候,表单已经全部接收完毕了。
form.parse(req, function(err, fields, files) {
if(err){
throw err;
}
console.log(fields);
console.log(files);
console.log(util.inspect({fields: fields, files: files}));
//所有的文本域、单选框,都在fields存放;
//所有的文件域,files
res.writeHead(200, {'content-type': 'text/plain'}); res.end("成功");
});
}
}); server.listen(80,"127.0.0.1");
8.3 实现上传的文件改名

fs.rename()

//创建服务器
var server = http.createServer(function(req,res){
//如果你的访问地址是这个,并且请求类型是post
if(req.url == "/dopost" && req.method.toLowerCase() == "post"){
//Creates a new incoming form.
var form = new formidable.IncomingForm();
//设置文件上传存放地址
form.uploadDir = "./uploads";
//执行里面的回调函数的时候,表单已经全部接收完毕了。
form.parse(req, function(err, fields, files) {
//if(err){
// throw err;
//}
//console.log(util.inspect({fields: fields, files: files})); //时间,使用了第三方模块,silly-datetime
var ttt = sd.format(new Date(), 'YYYYMMDDHHmmss');
var ran = parseInt(Math.random() * 89999 + 10000);
var extname = path.extname(files.tupian.name);
//执行改名
var oldpath = __dirname + "/" + files.tupian.path;
//新的路径由三个部分组成:时间戳、随机数、拓展名
var newpath = __dirname + "/uploads/" + ttt + ran + extname; //改名
fs.rename(oldpath,newpath,function(err){
if(err){
throw Error("改名失败");
}
res.writeHead(200, {'content-type': 'text/plain'});
res.end("成功");
});
});
}else if(req.url == "/"){
//呈递form.html页面
fs.readFile("./form.html",function(err,data){
res.writeHead(200, {'content-type': 'text/html'});
res.end(data);
})
}else{
res.writeHead(404, {'content-type': 'text/html'});
res.end("404");
}
}); server.listen(80,"192.168.41.36");

9.EJS 后台模板引擎

"E" 代表 "effective",即【高效】。EJS 是一套简单的模板语言,帮你利用普通的 JavaScript 代码生成 HTML 页面。EJS 没有如何组织内容的教条;也没有再造一套迭代和控制流语法;有的只是普通的 JavaScript 代码而已。

9.1 流程

模板——数据——数据绑定

var ejs = require("ejs");

//模板
var string = "好高兴啊,今天我买了iphone<%= a %>s";
//数据
var data = {
a : 6
};
//数据绑定
var html = ejs.render(string, data);
//输出
console.log(html);
9.2 模板应该单独设为文件
//app.js
var server = http.createServer(function(req,res){
fs.readFile("./views/index.ejs",function(err,data){
//绑定模板
var template = data.toString();
var dictionary = {
a:6,
news : [
{"title":"陈伟我爱你","count":10},
{"title":"哈哈哈哈","count":20},
{"title":"逗你玩儿的","count":30}
]
};
var html = ejs.render(template,dictionary); //显示
res.writeHead(200,{"Content-Type":"text/html;charset=UTF8"});
res.end(html);
});
}); server.listen(80,"127.0.0.1");
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<h1>好高兴啊,今天我买了一个iphone<%= a %>s</h1>
<ul>
<%
for(var i = 0 ; i < news.length ; i++){
if(news[i].count > 15){
%>
<li><%= news[i].title %></li>
<%
}
}
%>
</ul>
</body>
</html>

总结:类似的还有swig,jade。jade比较难,之前使用过swig模板。

最新文章

  1. [地图SkyLine二次开发]框架(3)
  2. LEETCODE —— Maximum Subarray [一维DP]
  3. hibernate查询语句实例代码
  4. topcoder SRM 622 DIV2 FibonacciDiv2
  5. Python - DICT 字典排序 - OrderedDict
  6. 微软IOC容器Unity简单代码示例3-基于约定的自动注册机制
  7. Qt之QCustomPlot绘图(一)配置和第一个例子
  8. java 发送邮件 email相关操作代码测试,生成复杂格式邮件,发送邮件相关操作
  9. New UWP Community Toolkit
  10. android自己定义控件之飞入飞出控件
  11. spring 使用外部属性文件
  12. Android使用Fragment实现TabHost效果
  13. 【重要】攻击动作时间段判断~使用动画time比较动画length和使用一个变量数组做延迟
  14. lr11录制时报“Request Connection: Remote Server @ 0.0.0.0:1080 (Service=?) NOT PROXIED! )”解决方法
  15. jquery中通过trim() length 判断数据是否有值
  16. CUDA学习笔记4:CUDA(英伟达显卡统一计算架构)代码运行时间测试
  17. 分享一个 markdown 编辑器 - Mditor
  18. 使用Visual C ++和Open Folder自定义环境
  19. Media所有参数汇总
  20. 以root用户身份在jenkins中运行shell命令

热门文章

  1. React-Native 之 GD (十八)监听 TabBarItem 点击与传值实现 点击 Item 进行刷新功能
  2. MySQL的性能指标计算和优化方法
  3. Vue知识整理1:$watch方法的使用
  4. 挣值管理(PV、EV、AC、SV、CV、SPI、CPI)
  5. vue封装element中table组件
  6. linux下安装python27 nginx 和uwsgi
  7. FormData模拟表单上传图片
  8. Java实验报告(一)&amp;&amp;第三周学习总结
  9. 老技术记录-C#+SqlServer使用SqlDependency监听数据库表变化
  10. CentOS7 修复MBR引导