欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

nodejs随手记

程序员文章站 2022-05-23 11:06:11
nodejs项目周 nodejs前端框架 一般做中间层 和操作数据库 传统模式和前后端分离最大的区别就是seo优化 HTTP常见的服务器软件 Apache Nginx (iis)微软的服务器现在已经不怎么用了 node服务器 可以自己编写服务 个人练习 nodejs依赖安装 Express框架 提供 ......

nodejs项目周

nodejs前端框架 一般做中间层 和操作数据库

传统模式和前后端分离最大的区别就是seo优化

http常见的服务器软件

apache nginx (iis)微软的服务器现在已经不怎么用了

node服务器 可以自己编写服务

个人练习

nodejs依赖安装

express框架 提供一系列强大特性帮助你创建各种web应用 
 框架安装
cnpm install --save express
 依赖安装 
npm init 配制文件
npm install -g supervisor node自启动工具 
启动命令 supervisor 文件名 自启工具命令 
npm install --save ejs 摸板引擎安装 
npm install body-parser --save 安装post接收的第三方模块
 
 

服务器

•服务器,也称伺服器,是提供计算服务的设备。由于服务器需要响应服务请求,并进行处理,因此一般来说服务器应具备承担服务并且保障服务的能力。 •常见的http服务器软件:apache、nginx、iis。 •node服务器:如果我们使用 php 来编写后端的代码时,需要 apache 或者 nginx 的 http 服务器, 来处理客户端的请求响应。不过对 node.js 来说,概念完全不一样了。使用 node.js 时, 我们不仅仅在实现一个应用,同时还实现了整个 http 服务器。
 
 
•1、引入 http 模块  
var http=require("http"); •2、创建服务器            接下来我们使用 http.createserver() 方法创建服务器,并使用 listen 方法绑定 8888 端口。 函数通过 request, response 参数来接收和响应数据。
 
 

 

/* req(request):返回url信息 res(response):浏览器返回相应信息 */ 

http.createserver(function(req,res){//如果状态是200,文件类html,字符集是utf-8   
res.writehead(200,{"content-type":"text/html;charset=utf8"});   
res.write("http://localhost:8888");  
res.end(); 
}).listen(8888);

express框架

express是一个简洁而灵活的 node.js web应用框架, 提供一系列强大特性帮助你创建各种web应用
npm install --save express
淘宝镜像
$ npm install -g
$ npm install -g
cnpm --registry=https://registry.npm.taobao.org npm install //安装依赖

自启动工具 supervisor

1、首先安装 supervisor npm install -g supervisor 
2、使用 supervisor 代替 node 命令启动应用 supervisor app.js

 

//引入express var express=require("express"); 
//实例化 var app=new express(); 
var host="localhost"; 
var port=8888;
 app.get("/",function (req,res) {    res.send("首页"); }); app.get("/news",function (req,res) {    res.send("新闻"); }); //在控制台打印信息 console.log("http://"+host+":"+port); //监听 app.listen(port,host);
 
 

ejs

安装ejs npm install --save ejs

//引入express

 var express=require("express");
var ejs = require('ejs'); //实例化
var app=new express(); 
var host="localhost"; 
var port=8888; //设置view层的目录 app.set("views",__dirname+"/pages"); //配置ejs模板扩展名 app.engine("html",ejs.__express); /*配置ejs模板引擎*/ app.set("view engine","html");
 
 

 

//配置静态资源库 app.use("/",express.static("static")); app.get("/",function (req,res) {    res.render("index"); }); //在控制台打印信息 console.log("http://"+host+":"+port); //监听 app.listen(port,host);
 
 

 

//配置静态资源库 app.use("/",express.static("static")); app.get("/",function (req,res) {    res.render("index"); }); //在控制台打印信息 console.log("http://"+host+":"+port); //监听 app.listen(port,host);
 
 

 

express 是一个自身功能极简,完全是由路由和中间件构成一个的 web 开发框架:从 本质上来说,一个 express 应用就是在调用各种中间件。 
中间件的功能包括 : 
1.执行任何代码。
 2.修改请求和响应对象。
3.终结请求-响应循环。
 4. 调用堆栈中的下一个中间件。
 
 

 

express 中间件有以下几种:
1.应用级中间件
2.路由级中间件
3.错误处理中间件
4.内置中间件
5.第三方中间件
 
 
 

 

 
应用级中间件  : app.use(function (req,res,next) {//可以匹配任何路由     next();//继续往下执行 });
 
 

 

 
 
 
 
路由中间件  : //首页 app.get("/",function (req,res,next) {     console.log(11);     next(); });
 
 

 

 
 
内置中间件  : app.use("/",express.static("static"));
 
 

 

 
 
错误处理中间件  : app.use(function (req,res,next) {       res.status(404).render('404',{}); });
 
 

 

第三方中间件 : //安装中间件 npm install body-parser –save //设置中间件 var bodyparser = require('body-parser') //支持request 中 body的 urlencoded字符,extended为false的时候,键值对中的值就为'string'或'array'形式,为true的时候,则可为任何数据类型。 app.use(bodyparser.urlencoded({ extended: false })) //返回一个只解析json的中间件 app.use(bodyparser.json()) 最后用req.body 获取数据
 
 

 

 
 
•get 请求的参数在 url 中,在 express 中,可以直接使用 req.query 对象。 •post 请求在 express 中不能直接获得,可以使用 body-parser 模块。使用后,将可以用 req.body 得到参数。
 •all 可以请求get和post
 
 

 

 
 
1、安装body-parser npm install --save body-parser
 2、引用body-parser var bodyparser=require("body-parser"); 
3、设置body-parser //设置body模式为x-www-form-urlencoded模式 //当extended为false的时候,键值对中的值就为'string'或'array'形式,为true的时候,则可为任何数据类型。为了安全性最好为extended=false app.use(bodyparser.urlencoded({extended:false})); app.use(bodyparser.json());//设置成json格式
 
 

 

req.query.id req.body.username接收

 

 

 
 
 
 
常用标签: 
<%%>:流程控制标签 
<%=%> :输出标签(原文输出html标签) 
<%-%> :输出标签(html会被浏览器解析) 
<%#%> :代码注释 
<%- include ../public/left%> 相同标签内容的配置引用 后面是相对入径
 
 

 

<ul>      
<% for(var i = 0 ; i < news.length ; i++){
%>            
<li>
<%= news[i]
%></li>       
<%
}
%>
</ul>
<%if type==1 %>  
vip会员
<%else if type==0%>   
普通会员 <%/if%>
 
 

mongodb数据库

非关系型数据库是键和值对应的存储方式
关系型数据库的代表作品       sql
非关系型数据库代表作品        mongodb
复杂结构的逻辑基本都是sql免费开源

 

mongodb 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,类似json格式,因此可以存储比较复杂的数据类型。
官网:https://www.mongodb.com/what-is-mongodb
手动启动:
1、mongod --dbpath="c:\mongodb\data"
2、mongo

关系型数据库与非关系型数据库的区别

nosql(nosql = not only sql ),意即“不仅仅是 sql”,它指的是非关系型的数据库,是以 key-value 形式存储,和传统的关系型数据库不一样,不一定遵循传统数据库的一些基本要求,比如说遵循 sql 标准 、表结构。它没有sql语句。
代表作:redis、memcached、mongodb
什么时候建议使用 nosql ?
1、对数据库高并发读写的需求
2、对海量数据的高效率存储和访问的需求
3、对数据库的高扩展性和高可用性的需求
nosql 和传统数据库简单对比。
1. 非结构型数据库。没有行、列的概念。用 json 来存储数据。
2. 集合就相当于“表 ”,文档就相当于“行”。
 

 

1、help 查看命令提示

db.help()
 
 

2、创建/切换数据库

use user
 
 

3、查询数据库

show dbs
 
 

4、查看当前数据库名

db
 
 

5、显示当前 db 状态

db.stats()
 
 

6、查看当前 db 版本

db.version()
 
 

7、查看当前 db 的链接机器地址

db.getmongo()
 
 

8、删除数据库

db.dropdatabase()
 
 

 

1、创建一个聚集集合

db.createcollection(”name",{capped:false,size:100000000,max:5})
参数:
name:集合的名字
capped:是否启用集合限制,如果开启需要制定一个限制条件,默认为不启用,如果开启不能删除数据
size:限制集合使用空间的大小,默认为没有限制,size的优先级比max要高
max:集合中最大条数限制,默认为没有限制
autoindexid:是否使用_id作为索引,默认为使用(true或false)
 
 

2、得到指定名称的聚集集合

db.getcollection("user")
 
 

3、得到当前 db 的所有聚集集合

show tables
 
 

4、删除集合

db.user.drop()
 
 

 

1、插入文档 (可以直接创建集合相当于db.createcollection)

db.user.insert({name:”zhangsan",age:30})
 
 

2、获得当前 db 的所有文档

db.user.find()
 
 

3、更新文档

db.user.update({name:”zhangsan"},{$set:{name:”lisi",gender:'男'}});
 
 

4、删除文档

db.user.remove({name:”zhagnsan"})
 
 

 

5、条件查询

db.user.find({name:”zhagnsan”},{age:1,name:1})
第一个参数:条件查询。第二个参数:显示哪些字段,1:显示,0:不显示
 
 

6、模糊查询

db.user.find({name:/zhagnsan/}) //模糊查询,相当于sql的like '%user1%'
db.user.find({name:/^zhagnsan/}) //开头查询,相当于sql的like '%user1'
db.user.find({name:/zhagnsan$/}) //结尾查询,相当于sql的like 'user1%'
 
 

7、条件操作符

db.user.find({age:{$gt:5}}) 大于5数据就出来了
db.user.find({age:{$lt:5}});小于5的数据出来
db.user.find({age:{$lte:5}});小于等于5的数据
db.user.find({age:{$gte:5}});大于等于5的数据
db.user.find({age:{$ne:5}});不等于5的数据
db.user.find({_id:{$gt:5}}).limit(8); 大于5且只显示8条
 
 

 

2、 limit 与 skip 方法

db.user.find().limit(8);只显示8条数据
db.user.find().skip(8);跳过前面的8条数据
db.user.find().skip(1).limit(8);从第一条开始,每页显示8条数据,如果skip(9)且limt(8)则从第9条数据显示,每页显示8条数据,可以做分页。
 
 

3、排序

db.user.find().sort({age:1});升序
db.user.find().sort({age:-1});降序
 
 

4、索引

索引是做优化,让数据读取速度更快。一般条件查询频繁的字段设置索引。比如:_id,还有咱们刚才的age。
创建索引
db.user.createindex({age:1});在age上建立索引1(升序),-1(降序),索引升序、降序和你的sort排序相关,如果升序和降序都要支持索引,那么就分别创建{age:1},{age:-1}
db.user.createindex({age:1},{background:true});
当系统已有大量数据时,创建索引非常耗时,需在后台执行,只需指定“background:true”即可。
查看详细索引信息
db.user.getindexes();
查看简单索引信息
db.user.getindexkeys();
删除所有索引
db.user.dropindexes()
删除指定索引
db.user.dropindex({age:1})
 
 

 

导出:

使用mongodb自带导出工具mongoexport,在bin目录下面
mongoexport -d dbname -c collectionname -o file --type json/csv -f field       
参数说明:         
  -d :数据库名           
-c :collection名          
-o :输出的文件名           
--type : 输出的格式,默认为json          
-f :输出的字段,如果-type为csv,则需要加上-f "字段名"
 
 

 

导入:

使用mongodb自带导入工具mongoimport ,在bin目录下面
mongoimport -d dbname -c collectionname --file filename --headerline --type json/csv -f field --jsonarray
参数说明:         
  -d :数据库名           
-c :collection名          
--file :要导入的文件
--type : 导入的格式,默认为json          
-f :输出的字段,如果-type为csv,则需要加上-f "字段名"
--jsonarray:支持数组,如果出现failed: error unmarshaling bytes on document #0: json decoder out of sync - data changing underfoot?使用这个参数试试
 
 

可视化工具robo3t

下载地址:https://robomongo.org/download

mongoose中间件

npm install --save mongoose         

数据库连接状态 

// 1、引入mongoose
var db=require(“mongoose”);
//2、 连接数据库
//usenewurlparser:会在url里识别验证用户所需的db,未升级前不需要指定,升级一定要指定。
db.connect(“mongodb://localhost:27017/demodb”,{ usenewurlparser: true });
 
//创建账号和密码连接
//db.connect(“mongodb://admin:123456@localhost:27017/demodb",{ usenewurlparser: true });
// 连接失败
db.connection.on("error",function (err) {
    console.error("数据库链接失败:"+ err);
});
//连接成功
db.connection.on("open",function () {
    console.log("数据库连接成功");
});
//断开数据库
db.connection.on("disconnected",function () {
    console.log("断开连接");
});
 
 

3、创建模型

var userschema=new db. schema({
      name:{
          type: string,//字段类型
          trim:true //可以去除空格
      },
      age:{
          type:number ,
          default:1
     }
})
//字段名称必须和数据库里集合的字段一致
var usermodel= db.model(”user",userschema,”user");
第一个参数:user,第一个字母大写,数据库集合名必须是users,注意最后一个字母必须有个s,否则找不到集合。
第二个参数:传入schema
第三个参数:如果数据库的集合没有后面的s,那么可以传入第三个参数必须和表名一致,比如表名为user,那么第三个参数是user
 
 

 

 

添加数据(比较特殊)

1、先实例化model
var um=new usermodel({
      name:”李四”,
      age:30
});
um.save(function(err,data){
    console.log(err,data);
})
 
 

查询数据

usermodel.find({_id:111111},{_id:0,name:1,age:1},function(err,data){
       console.log(err,data);
})
第一个参数查询的条件
第二个参数自定义显示字段,1:显示,0:不显示
 
 

删除数据

usermodel.deleteone({_id:111111},function(err,data){
       console.log(err,data);
})
修改数据
usermodel.updateone({_id:111111},{name:”王五”,age:20},function(err,data){
      console.log(err,data);
})
第一个参数:是要修改数据的条件
第二个参数:是修改的数据
 
 

使用multiparty实现文件上传

//配置文件上传的静态资源
app.use("/uploadfiles",express.static("uploadfiles"));
 
<form action="/reg/save" method="post"  enctype="multipart/form-data">
    头像上传:<input type="file" name="image"  />
    <button type="submit">注册</button>
</form>
支持文件上传:
1、form里面必须设置:enctype=”multipart/form-data”
2、input类型type=”file”

 

1、安装multiparty
npm install –save multiparty
2、引用multiparty
var multiparty=require('multiparty');
3、实例化multiparty并调用form方法
var form=new multiparty.form();
//设置文件存放目录
form.uploaddir=“uploadfiles”;
/*
err:是否有错误
fields:获取post字段名称
files:获取文件信息
*/
form.parse(req, function(err,fields,files){
      console.log(err,fields,files);
});

 

 

1、安装express-session

npm install --save express-session
 
 

 

2、引入express-session

var session = require("express-session");
 
 

 

3、配置session

//配置中间件  固定格式
app.use(session({
    secret: '1q2w3e4r',//secret是必需的选项,这是用于签名会话id cookie的密钥,自己随便写。
   resave: false,//resave是指每次请求都重新设置session cookie,如果为false:假设你的cookie是10分钟过期,每次请求都会再设置10分钟
    saveuninitialized: true,//saveuninitialized是指无论有没有session cookie,每次请求都设置个session cookie
    cookie: {
      maxage:1000*60*30//单位为毫秒,30分钟过期
},
rolling:true//强制在每一个response中都发送session标识符的cookie。
}));
 
 
设置session
req.session.username=”zhagnsan”;
获取session
req.session.username
 
 

安装:

npm install --save md5-node
 
 

 

使用:

1、引入md5-node

var md5=require("md5-node");
 
 

 

2、调用

md5('123456')
 
 

 

安装

npm install --save jsonwebtoken
 
 

 

json web token 简称jwt 标准的 token 有三个部分:
header(头部)
{ "alg": "hs256", "typ": "jwt"}
alg:意思是这个 jwt 用的算法是 hs256
typ:类型是jwt
payload(数据)
{  "sub": "1234567890",  "name": "john doe",  "iat": 1516239022}
signature(签名)
hmacsha256( base64urlencode(header) + "." + base64urlencode(payload),secret )
 
 

 

中间用点分隔开,并且都会使用 base64 编码,所以真正的 token 看起来像这样:
eyjhbgcioijiuzi1niisinr5cci6ikpxvcj9.eyjzdwiioiixmjm0nty3odkwiiwibmftzsi6ikpvag4grg9liiwiawf0ijoxnte2mjm5mdiyfq.sflkxwrjsmekkf2qt4fwpmejf36pok6yjv_adqssw5c
 
 

 

v

ar jwt=require(“jsonwebtoken”);
会员登录时创建token:
//token数据
var payload={
     "iss":"demo.com",
     "username":username};
//设置密钥
var token=jwt.sign(payload, ”123456”, {expiresin:"1day"});//1day表示1天,如果设置30表示30秒
req.session.auth_token=token;
 
 

 

 

app.use(function (req,res,next) {
//将session缓存,存入到全局变量,可以让每个ejs模板使用
req.app.locals['islogin']=req.session.islogin;
req.app.locals['userinfo']=req.session.userinfo;
    var search=req._parsedurl.search?req._parsedurl.search:"";//获取问号和参数
//用req.url获取当前页面的url路径,确定会员认证的页面
    if(req.url=="/profile" || req.url=="/user"+search){
        jwt.verify(req.session.auth_token,config.secret, function (err,dec) {
            if (!err && req.session.islogin){
                   next();
            } else{
                res.redirect(‘/login’);
            }
        });
    }else{
        next();
    }
});
 
 

 

 

restful接口是一种软件架构风格、设计风格,而不是标准,只是提供了一组设计原则和约束条件。它主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。
接口示例:
http://127.0.0.1/user/1   1代表id=1
特点:没有?和参数直接用/做分割传参
科大讯飞人脸识别接口:
http://tupapi.xfyun.cn/v1/face_score? image_url=xxxx&image_name=bbbbb
微信支付订单查询接口:
https://api.mch.weixin.qq.com/pay/orderquery?appid=wxd678efh567hg6787
 
 

 

 

restful接口共性(所谓的标准):
1、让用接口的人看到url的地址就能猜到是干什么用的。
2、没有编程语言的扩展名,不知道使用什么编程语言开发,做了url重写,方便接口名称的统一性,后端更换开发语言,接口名称不变。
 
 

 

一、版本控制
https://api.example.com/v{n}
1、应该将api的版本号放入url。
2、采用多版本并存,增量发布的方式。
3、n代表版本号,分为整型和浮点型
   整型:    大功能版本,  如v1、v2、v3 ...
   浮点型:  补充功能版本, 如v1.1、v1.2、v2.1、v2.2 ...
4、对于一个 api 或服务,应在生产中最多保留 3 个最详细的版本
 
 

 

 
 
保留 3 个最详细的版本说明
比如:jquery的版本号:1.7.2,1.12.4
第一个:重大版本更新,重构或改版,程序的功能和设计的板式重构。
第二个:补充升级,新增了一些功能。
第三个:bug修复
 
 

 

 

二、响应参数
{
   status: 200,               // 详见【status】
   data: {
      code: 1,                // 详见【code】
      data: {} || [],         // 数据
      message: '成功',        // 存放响应信息提示,显示给客户端用户【须语义化中文提示】
      sysmessage: 'success'   // 存放响应信息提示,调试使用,中英文都行
      ...                     // 其它参数,如 total【总记录数】等
   },
   msg: '成功',            // 存放响应信息提示,显示给客户端用户【须语义化中文提示】
   sysmsg: 'success'       // 存放响应信息提示,调试使用,中英文都行
}
【status】:
           200: ok       400: bad request        500:internal server error       
                         401:unauthorized
                         403:forbidden
                         404:not found
面试必会状态码预览:http://www.lucklnk.com/godaddy/details/aid/148465578
【code】:
         1: 获取数据成功 | 操作成功             0:获取数据失败 | 操作失败
 
 
 
 
postman下载地址: https://www.getpostman.com/downloads/
json格式化校验地址:http://www.bejson.com/
cdn引入网址:https://cdnjs.com/
 
 

 

什么是跨域?
不符合同源策略就会出现跨域。常见跨域就是用ajax请求服务端接口。
什么是不符合同源策略?
1、协议不同(http or https等)
2、域名或ip地址不同
3、端口不同
 
 

 

 

解决跨域的方案:
1、使用jsonp解决
优点:暴力,简单。
缺点:不安全,只支持get,需要后端大量配合,无
 
 

 

法做到接口统一性,开发成本大。
应用场景:流量统计,比如第三方的百度统计
 
 
2、使用webpack做代理(vue、react等)
优点:不需要后端配合就可以跨域请求数据,做vue和react开发时必须配置。
缺点:只能在测试环境(开发者环境development)下跨域,正式环境(生成环境production)下面不能跨域。
应用场景:比如咱们在做开发,接口需要在测试环境下使用,等开发完成后正式上线前端和接口符合同源策略。这样的情况下后端是不会给你开启跨域功能。所以需要配置代理解决。
 
 

 

 

 

3、后端解决(最终解决方案)
方法一:
在路由拦截钩子函数中
app.use(function(req, res, next) {
//解决跨域
//*所有地址,指定地址:http:localhost:111
//指定多个地址:['http://localhost','http://localhost:111','http://www.baidu.com']
res.header(“access-control-allow-origin”, “*”);
next();
});
 
 

 

方法二:
cors解决跨域
1、引入cors
var cors = require('cors');
2、启用cors
app.use(cors(
{
          origin:“*”,  //指定接收的地址 ‘*’:所有地址,指定地址:[‘http:localhost:111’]
          optionssuccessstatus: 200    }
));
 
 

 

 

1、安装multiparty
npm install –save multiparty
2、引用multiparty
var multiparty=require('multiparty');
3、实例化multiparty
var form=new multiparty.form();
//设置文件存放目录form.uploaddir=“uploadfiles”;
 
 

 

 

/*
err:是否有错误
fields:获取post字段名称
files:获取文件信息
*/
form.parse(req, function(err,fields,files){
      console.log(err,fields,files);
});
 
 

 

 

1、引用jquery和jquery.form
<script src="../static/js/jquery.js"></script><script src="../static/js/jquery.form.js"></script>
var submiturl=”http://localhost:3003/v1/product/upload";//服务端接口地址
var showimg=$("#show-img"),image=$("#image");
$("#form1").ajaxsubmit({
    url:submiturl,
    type:"post",
    datatype:"json",
    beforesend:function () {
      console.log("上传中");
    },
        success:function (data) {
        showimg.attr("src",data.data.showimg);
        image.val(data.data.filepath);
      }
})
 
 

 

 

 

seo(search engine optimization):汉译为搜索引擎优化。是一种方式:利用搜索引擎的规则提高网站在有关搜索引擎内的自然排名。
 
 

 

 

什么是服务端渲染?
服务端渲染是先向后端服务器请求数据,然后生成完整html返回给浏览器。
优点:
1、更利于seo
不同爬虫工作原理类似,只会爬取源码,不会执行网站的任何脚本(google除外,据说googlebot可以运行javascript)。
2、更利于首屏渲染
首屏的渲染是node或php服务端发送过来的html字符串,并不依赖于js文件了,这就会使用户更快的看到页面的内容。尤其是针对大型单页应用,打包后文件体积比较大,普通客户端渲染加载所有所需文件时间较长,首页就会有一个很长的白屏等待时间。
缺点:
1、服务端压力较大
本来是通过客户端完成渲染,现在统一到服务端node服务去做。尤其是高并发访问的情况,会大量占用服务端cpu资源。
2、前后端不分离(传统模式开发)
由于前后端不分离,学习成本比较大,后端人员需要懂一些html+css+javascript。前端也要懂一些后端语言比如:php、java、node等。
 
 

 

 

1、title包含要优化的关键词,比如我要优化:网站建设
<title>北京网站制作|网站设计公司|高端网站建设-尚品中国</title>
|:作为关键词分隔符
-:后面是品牌词
2、keywords(关键词)和 description(描述)
<meta name=“keywords” content=“企业建站,互动网站建设,做网站,网站制作,网站建设,网站设计,北京网站建设,北京网站制作,北京网站设计,网站建设公司,网站制作公司,网站设计公司,企业网站建设,企业网站制作,公司网站建设” />
重点:包含你要优化的关键词,关键词要包含title的关键词。
 
 

 

<meta name=“description” content=“尚品中国隶属于恒久尚品网络科技(北京)有限公司,专注于网站制作、网站设计、高端网站建设、以企业建站、互动网站建设、做网站、北京网站建设公司、北京网站制作公司、北京网站设计公司、移动应用、创新技术、vi视觉设计为核心业务,成立于北京,是国内十佳品牌网站建设公司,以专业技术成就了数千精品网站成功案例供您赏析。” />
重点:描述里面包含title关键词和keywords关键词。
3、语义化标签
<header>:头部
<footer>:页脚
<nav>:导航
<aside>:标签一般使用在页面、文章的侧边栏、广告、友情链接等区域。
<article>:文章内容标签。包括标题、正文和脚注。
<strong>:加粗。强调标签。用于文章强调关键词。
<h1>:标题。用于定义文章的标题。(一个页面只能有一个h1标签)
 
 

 

 

 

npm install --save socket.io
 
 

 

const express = require(‘express’)
var app = express();
var server = require(‘http’).createserver(app);
//创建socket
var io = require('socket.io')(server);//链接
io.on('connection', function(socket){
//断开连接
socket.on("disconnect",function(data){
     console.log("client disconnect",data);
});
 
 

 

//接收和发送数据
socket.on('all', function(data){
         console.log(data);
         io.emit('message', data)
     })
})
server.listen(8000, function(){
    console.log('服务器已启动:ws://localhost:8000')
})
 
 

 

 

1、引入socket.io.js
<script src="js/socket.io.js"></script>
 
 
2、链接服务端
var socket = io(“ws://localhost:8000”);
 
 
3、接收服务端数据
socket.on("message",function(data){
     console.log(data);
})
 
 
4、发送数据到服务端
socket.emit('all', ”你好”);
 
 
5、断开socket
socket.close();
 
 

 

npm install --save node-httpclient
 
 

 

 

1、引入node-httpclient
var $=require(“node-httpclient”);
 
 
2、使用node-httpclient
$.ajax({
  url: 'http://www.yourdomain.com/api',
  type: 'get',
  success: function(data, status){
    console.log(data, status);
  }
});