NodeJs - 100

news/2024/7/19 9:13:33 标签: json, 爬虫, 操作系统

Nodejs官方文档

https://nodejs.org/en/
https://nodejs.org/en/docs/

 

 

Nodejs的特征: 

1、采用非阻塞性IO机制;—— 不需要担心造成死锁

2、只支持单线程;

3、事件环;

 

 类

class User {
    constructor(data) {
        super(data);
    }
}

 

require 加载模块

var express = require('express');
var fs = require('fs');
var path = require('path');
var http = require('http');

 

练习1:本地服务器

var app = express();
var config = require('./config/config.js');
app = config(app);
app.listen();    //启动监听端口
console.log("端口已启动");

 

练习2:读写文本

//读取文本
fs.readFile(path.join(__dirname,'/data/test.json'),{encoding:'utf-8'},function(err,data){
    
    if(err) throw err;
    
     console.log(data);

});

//写入文本
fs.writeFile(path.join(__dirname,'/data/test.json'),"Hello World",function(err){
    
    if(err) throw err;
    
     console.log("OK");

});

 

练习3:创建简单的http服务器

http.createServer(function(request,response){
    response.writeHead(200,{'Content-Type':'text/plain'});
    response.end('Hello World!');
}).listen('6634');


console.log("server runing");

 

练习4:常规断点调试

http.createServer(function(request,response){
    response.writeHead(200,{'Content-Type':'text/plain'});
    debugger
    response.end('Hello World!');
}).listen('6634');

 

练习5:超级调试

先下载安装插件

sudo npm install -g node-inspector

启动插件

node-inspector

新建控制台

command+n

启动练习4的项目

node --debug app.js

google浏览器:http://localhost:8080/debug?port=5858

 

 

发送get/post请求

推荐配合request-promise使用。使用promise风格比较利于开发

https://github.com/request/request-promise

var _request = require('request');

# get请求示例
exports.load_AJAX = function(callback)
{
    _request.get('http://localhost/json2.php',function(err,response,body)
    {
        if(response.statusCode = '200')
        {
            callback(body);
        }
    })
}

# post请求示例
var post_data = function(callback)
{
    _request.post('http://localhost/json2.php',{
        'key':'lovemp',
        'name':'lee'
    },function(err,response,body){
        if(response.statusCode = '200')
        {
            callback(body);
        }
    })
}

# request支持application/x-www-form-urlencoded和multipart/form-data实现表单上传。不用操心设置header之类的琐事,request会帮你解决。
_request.post(API_SERVER, {form:{
        UserId: 'A6F28BA9C3BDA307',
        MethodName: 'user_info'
    }},(err, response, body) => {            
        console.log(response.statusCode,err,response,body);        
})


# 使用promise风格 : https://github.com/request/request-promise
var rp = require('request-promise');
var options = {
            method: 'POST',
            uri: API_SERVER,
            form:{
                UserId: 'A6F28BA9C3BDA307',
                MethodName: 'user_info'
            },
            headers: {
                /* 'content-type': 'application/x-www-form-urlencoded' */ // Set automatically
            }
        };

rp(options) .then(function (body) {
    // POST succeeded...
    console.log(body)
})
.catch(function (err) {
    // POST failed...
    console.log(err)
});

# 同上
var rp = require('request-promise');
rp.post(API_SERVER, {form:{
        UserId: 'A6F28BA9C3BDA307',
        MethodName: 'user_info'
}}).then( (body) => {
    console.log(body)
}).catch(function (err) {
    console.log(err)
});

  

express - RESTful API

"use strict";
const express = require('express');
const fs = require('fs');
const url = require('url');

let app = express();
let port = 8090;
let result = "";


// all、get、post三种方式
app.all('/ajax/menu/:id', function (req, res) {
    res.header('Access-Control-Allow-Origin', '*');
    res.header("Content-Type", "text/plain;charset=utf-8");
    let id = req.params.id;
    if(req.url!=="/favicon.ico" && !isNaN(id)) {
       result = {state:"200",msg:"success",result:fs.readFileSync("../data/menu.json", 'utf8')}; 
    } else {
        result = {state:"500",msg:"shoperId is not defined"}
    }
    res.end(JSON.stringify(result));
})
var server = app.listen(port, function () { console.log("Server Start!"); })

 

爬虫

需要下载三个依赖

sudo npm install express superagent cheerio --save-dev

知识点: express 新建本地服务器, superagent 发送get/post请求, cheerio 我最喜欢的nodejs版本的jquery,res.send 发送到页面

const express = require('express')
const superagent = require('superagent')
const cheerio = require('cheerio')
var app = express()
var resultArr = []
app.get('/', (req,res,next) => {
  superagent.get('https://cnodejs.org/').end((err, response) => {
    if(err) console.log(err)
    let $ = cheerio.load(response.text)
    $('#topic_list .topic_title').each((index,element) => {
      let resultObj = {
          title: '',
          href: ''
      }
      resultObj.title = $(element).attr('title')
      resultObj.href = $(element).attr('href')
      resultArr.push(resultObj)
    })
    res.send(resultArr)
  })
})

app.listen(process.env.PORT || 8090)
console.log('Server Start!')

 

解决charset、encoding  gb2312的问题

https://www.cnblogs.com/CyLee/p/9557109.html

// npm i request cheerio iconv-lite
const request = require('request');
const cheerio = require('cheerio');
const iconv = require('iconv-lite');

request({
    url: 'http://roll.mil.news.sina.com.cn/col/zgjq/index.shtml',
    encoding : null
}, function (err, response, body) {
    if (err) throw new Error(err.message);
    var str = iconv.decode(response.body, 'GBK').toString();
    console.log(20180829214413, str)
});

 

爬虫简单版

const superagent = require('superagent')
const cheerio = require('cheerio')

superagent.get('http://localhost:8080/inde_x.html').end((err, response) => {
    // 注意属性可以防止unicode编码
    const $ = cheerio.load(response.text, {decodeEntities: false})

    // 报告编号 + 查询时间 + 报告时间
    const table1 = $('table table').eq(0).find('tr:nth-child(2)').find('.p')
    // 报告编号
    const report_number = table1.eq(0).html().split(":")[1];
    // 查询时间
    const query_time = table1.eq(1).html().split(":")[1];
    // 报告时间
    const report_time = table1.eq(2).html().split(":")[1];
    // 打印测试
    console.log(report_number,query_time,report_time)

    
    // 姓名 + 证件类型 + 证件号码 + 婚姻
    const table2 = $('table table').eq(1).find('tr').find('.p')
    // 姓名
    const report_name = table2.eq(0).html().split(":")[1];
    // 证件类型
    const report_type = table2.eq(1).html().split(":")[1];
    // 证件号码
    const report_id = table2.eq(2).html().split(":")[1];
    // 婚姻
    const report_marriage = table2.eq(3).html();
    // 打印测试
    console.log(report_name,report_type,report_id,report_marriage)
    
    // 表格
    let arr = []
    // Copy Selector
    const table3 = $('body > div > div > table > tbody > tr:nth-child(2) > td > table:nth-child(6) > tbody > tr:nth-child(3) > td > table > tbody > tr > td > table > tbody > tr')
    table3.each((i, el) => {
        let json = {}
        $(el).find('td').each((index, ele) => {
            json[index] = $(ele).text().trim()
        })
        arr.push(json);
    })
    console.log(arr)
})

 

爬虫2 + 代理服务器

访问地址:http:localhost:8090?query=123

知识点:get参数获取,header设置

const http = require('http')
const url = require('url')
const util = require('util')
const superagent = require('superagent')
const cheerio = require('cheerio')


const onRequest = (req,res) => {
    res.writeHead(200, {'Content-Type': 'text/plain;charset=utf-8', 'Access-Control-Allow-Origin': '*'})
/*
let money = encodeURI(url.parse(req.url,true).query.money);
let day = encodeURI(url.parse(req.url,true).query.day);
*/
    let keyWord = encodeURI(url.parse(req.url,true).query.query);   /* 最后一个query就是参数,在网页输入http://localhost:8090?query=123 就是了 */



    if(keyWord){
      superagent.get('http://weixin.sogou.com/weixin?type=1&query=' + keyWord + '&ie=utf8&_sug_=n&_sug_type_=').end(
          (err,response) => {
            if(err) console.log(err)
            let resultArr = []
            let $ = cheerio.load(response.text)
            $('.mt7 .wx-rb').each((index, item) => {
              let resultObj = {
                title: '',
                wxNum: '',
                link: '',
                pic: ''
              }
              resultObj.title = $(item).find('h3').text()
              resultObj.wxNum = $(item).find('label').text()
              resultObj.link = $(item).find('href').text()
              resultObj.pic = $(item).find('img').attr('src')
              resultArr.push(resultObj)
            })
            res.write(JSON.stringify(resultArr))
            res.end()
        })
    }
}

http.createServer(onRequest).listen(process.env.PORT || 8090);
console.log('Server Start!')

  

推荐代理方法:

神坑,注意 end 函数是异步的,所以res.end()也需要在回调中执行才正常

/* 这个API有详情,稍后再做 */
"use strict";
const http = require('http');
const url = require('url');
const util = require('util');
const superagent = require('superagent');
const open = require("open");

const appId = "2693ea802b98ae56d668a279e139c750";
let result = "";
let port = 8090;

const onRequest = (req,res) => {
    res.writeHead(200,{'Content-Type':'text/plain;charset=utf-8','Access-Control-Allow-Origin':"*"})
    let qq = encodeURI(url.parse(req.url,true).query.qq);
    console.log("QQ",qq);
    if(req.url!=="/favicon.ico")
    {
        superagent.get(`http://japi.juhe.cn/qqevaluate/qq?qq=${qq}&key=${appId}`).end((err,response) => {
                if(err) console.log(err);
                console.log("response.text",response.text);
                result = response.text; 
                res.write(result);
                result = "";
                res.end();
        })
    }
}


http.createServer(onRequest).listen(port);  
// open(`http://localhost:${port}?qq=928532756`);
console.log("Server Start!");

 


  

事件环机制 

https://nodejs.org/dist/latest-v6.x/docs/api/events.html

在Nodejs中,虽然不会拥有和客户端一样的“click”,"onmouseover"之类的用户交互事件,但存在一系列服务器应用程序中所可能触发的各种事件,例如,当一个用户向服务端发出一个客户端请求时,将触发http服务器在nodejs中被定义为“request”的事件。 

 

事件监听,在浏览器中输入http://localhost:1337

if(req.url !== "/favicon.ico") 为浏览器为页面在首场中的显示图标,通过该if屏蔽
var http = require('http');
var app = http.createServer();

app.on('request',function(req,res){
    if(req.url !== "/favicon.ico"){
        console.log(req.url);
    }
    res.end();
}).listen(1337,'127.0.0.1');

 事件绑定以及触发

var http = require('http');
var app = http.createServer();

app.on('myevent',function(arg1,arg2,arg3){
    console.log(arg1,arg2,arg3);
})

app.emit('myevent',1,2,3);

 

方法

序号方法 & 描述
1addListener(event, listener)
为指定事件添加一个监听器到监听器数组的尾部。
2on(event, listener)
为指定事件注册一个监听器,接受一个字符串 event 和一个回调函数。
server.on('connection', function (stream) { console.log('someone connected!'); });
3once(event, listener)
为指定事件注册一个单次监听器,即 监听器最多只会触发一次,触发后立刻解除该监听器。
server.once('connection', function (stream) { console.log('Ah, we have our first user!'); });
4removeListener(event, listener)
移除指定事件的某个监听器,监听器 必须是该事件已经注册过的监听器。
var callback = function(stream) { console.log('someone connected!'); }; server.on('connection', callback); // ... server.removeListener('connection', callback);
5removeAllListeners([event])
移除所有事件的所有监听器, 如果指定事件,则移除指定事件的所有监听器。
6setMaxListeners(n)
默认情况下, EventEmitters 如果你添加的监听器超过 10 个就会输出警告信息。 setMaxListeners 函数用于提高监听器的默认限制的数量。
7listeners(event)
返回指定事件的监听器数组。
8emit(event, [arg1], [arg2], [...])
按参数的顺序执行每个监听器,如果事件有注册监听返回 true,否则返回 false。

类方法

序号方法 & 描述
1listenerCount(emitter, event)
返回指定事件的监听器数量。

事件

 

序号事件 & 描述
1newListener
  • event - 字符串,事件名称

  • listener - 处理事件函数

该事件在添加新监听器时被触发。

2removeListener
  • event - 字符串,事件名称

  • listener - 处理事件函数

从指定监听器数组中删除一个监听器。需要注意的是,此操作将会改变处于被删监听器之后的那些监听器的索引。

 

nodejs模块化编程

var _name,_age;
var name = '',age=0;

var foo = function(name,age){
    _name = name;
    _age = age;

    foo.prototype.getName = function(){
        return _name;
    }

    foo.prototype.setName = function(name){
         _name = name;
    }

    foo.prototype.getAge = function(){
        return _age;
    }

    foo.prototype.setAge = function(age){
         _age = age;
    }
}

foo.prototype.name = name;
foo.prototype.age = age;

foo.staticName = '';
foo.staticFunction = function(){
    console.log(foo.staticName);
}

module.exports = foo;

 

 使用上面的模块

var foo = require('foo');

var myFoo = new foo('Lee',18);

console.log("第一次获取",myFoo.getName(),myFoo.getAge());

myFoo.setName("Mp");myFoo.setAge(19);

console.log("修改私有变量后",myFoo.getName(),myFoo.getAge());

myFoo.name = "shenyi";
myFoo.age = 38;

console.log("修改共有变量后",myFoo.getName(),myFoo.getAge(),"可以看出修改共有变量没有起作用");

console.log("下面我们使用类的静态属性和静态方法");
foo.staticName = "static Lee";
foo.staticFunction();

 

使用node_modules来管理模块

//在项目根目录下进行以下操作
mkdir node_modules

//进入node_modules中,创建foo目录,然后进入创建index.js,将模块的代码放入其中。然后修改require('./test.js')的引用目录为require('foo');
cd node_modules;
mkdir foo;
cd foo;
touch index.js

 

进阶管理

//在foo文件夹中加入package.json,并加入以下代码:
{
    "name":"foo",
    "main":"./lib/foo.js"
}

新建一个lib文件夹,并且将index.js放入其中,然后改名为foo.js

 

 

NPM包管理工具 

// 查看全局包的安装路径
npm root -g

// 修改全局包的安装路径
npm config set prefix "d:\node"

// 查看包的信息
npm view <包名>

// 查看当前目录下所有的包
npm list

// 查看安装路径下所有的包
npm list -g

// 卸载某个包
npm uninstall <包名>

// 卸载安装路径下的某个包
npm uninstall -g <包名> 

// 更新当前目录下所有包
npm update

// 更新安装目录下所有包
npm update -g 

// 更新当前目录下某个包
npm update <包名>

// 更新安装目录下某个包
npm update -g <包名>

 


 

 

文件操作系统

https://nodejs.org/dist/latest-v6.x/docs/api/fs.html

读取文件

/* 如果读取的时候不使用utf8参数,默认是使用buffer格式,也可以使用toString() 方法来转化为正常文字 */
var fs = require('fs');

var data = fs.readFileSync("./index.html",'utf8');  
console.log("同步读取,等待操作返回结果",data);

fs.readFile('./index.html','utf8',function(err,data){
    console.log("操作结果作为回调函数的第二个参数返回",data);
})

 写入文件

/* 如果读取的时候不使用utf8参数,默认是使用buffer格式,也可以使用toString() 方法来转化为正常文字 */
var fs = require('fs');

fs.writeFile('./test.txt','第一行。\r\n 第二行',function(err){
    if(err) console.error("文件写入失败");
    else console.log("文件写入成功");
})

 追加数据

/* 如果读取的时候不使用utf8参数,默认是使用buffer格式,也可以使用toString() 方法来转化为正常文字 */
var fs = require('fs');

var option = {
    flag:"a"
}

fs.writeFile('./test.txt','这是追加的数据',option,function(err){
    if(err) console.error("文件写入失败");
    else console.log("文件写入成功");
})

/* 也可以使用appendFileSync */
fs.appendFile('./test.txt','我又是追加的数据','utf8',function(err){
    if(err) console.error("文件写入失败");
    else console.log("文件写入成功");
})

 文件的打开和读取

同理有readSync

/* 如果读取的时候不使用utf8参数,默认是使用buffer格式,也可以使用toString() 方法来转化为正常文字 */
var fs = require('fs');

// data为打开文件时返回的文件描述符,在window中称为文件句柄
fs.open('./test.txt','r',function(err,data){
    var buf = new Buffer(255);
    // 从第0个开始到第9个字符,截取3个字符串
    fs.read(data,buf,0,9,3,function(err,bytesRead,buffer){
        console.log(buffer.slice(0,bytesRead).toString());

        //从上一次读取的位置继续往下读
        fs.read(data,buf,0,3,null,function(err,bytesRead,buffer){
            console.log(buffer.slice(0,bytesRead).toString());
        })
    })

})

文件的打开和写入、追加

同理有writeSync

/* 如果读取的时候不使用utf8参数,默认是使用buffer格式,也可以使用toString() 方法来转化为正常文字 */
var fs = require('fs');

var buf = new Buffer('我喜爱编程');

// w 会清空文件的内容
fs.open('./test.txt','w',function(err,data){
    fs.write(data,buf,3,9,0,function(err,written,buffer){
        if(err) console.log('写入文件失败');
        console.log('写入文件成功');
    })
})// a 追加文件内容
fs.open('./test.txt','a',function(err,data){
    fs.write(data,buf,3,9,0,function(err,written,buffer){
        if(err) console.log('写入文件失败');
        console.log('写入文件成功');
    })
})

 


 

 

close方法 / closeSync方法 

当对文件的读写操作执行完毕后,我们通常需要关闭该文件。尤其是在文件以排他方式被打开时

/* 如果读取的时候不使用utf8参数,默认是使用buffer格式,也可以使用toString() 方法来转化为正常文字 */
var fs = require('fs');

var buf = new Buffer('我喜爱编程');

// w 会清空文件的内容
fs.open('./test.txt','a',function(err,data){
    fs.write(data,buf,0,15,0,function(err,written,buffer){
        if(err) console.log('写入文件失败');
        console.log('写入文件成功');
        fs.close(data);
    })
})

 

fsync 方法确保文件全部写入

 在使用write/writeSync 方法在文件中写入数据时,操作系统的做法是首先将该部分数据读到内存中,再把数据写到文件中,这时如果你使用close/closeSync方法关闭文件时,就会造成数据流失。正确的姿势是使用fync方法来对文件进行同步操作。即把内存中缓冲区中的剩余数据全部写入文件中。写法如下

 fs.fync(fd,[callback]) / fs.fyncSync(fd)

/* 如果读取的时候不使用utf8参数,默认是使用buffer格式,也可以使用toString() 方法来转化为正常文字 */
var fs = require('fs');

var buf = new Buffer('我喜爱编程');

// w 会清空文件的内容
fs.open('./test.txt','a',function(err,data){
    fs.write(data,buf,0,15,0,function(err,written,buffer){
        if(err) console.log('写入文件失败');
        console.log('写入文件成功');
        fs.fsync(data);
        fs.close(data);
    })
})

 

mkdir创建文件目录

同理mkdirSync

/* 如果读取的时候不使用utf8参数,默认是使用buffer格式,也可以使用toString() 方法来转化为正常文字 */
var fs = require('fs');

fs.mkdir('./test',function(err){
    if(err) console.log('create失败');
    else console.log('create成功');
})

 

readdir读取文件目录列表

同理readdirSync

/* 如果读取的时候不使用utf8参数,默认是使用buffer格式,也可以使用toString() 方法来转化为正常文字 */
var fs = require('fs');

fs.readdir('./test',function(err,files){
    if(err) console.log('失败');
    else console.log(files);
})

 

stat/lstat查看目录信息,两者的区别是,当查看符号链接文件的信息时,必须使用后者

同理statSync / lstatSync 

/* 如果读取的时候不使用utf8参数,默认是使用buffer格式,也可以使用toString() 方法来转化为正常文字 */
var fs = require('fs');

fs.stat('./test',function(err,stats){
    console.log(stats);
});

 

exists 检查文件或者目录是否存在

同理existsSync

/* 如果读取的时候不使用utf8参数,默认是使用buffer格式,也可以使用toString() 方法来转化为正常文字 */
var fs = require('fs');

fs.exists('./test',function(exists){
    if(exists) console.log('该文件存在');
    else console.log('该文件不存在');
});

 

realpath获取文件或者目录的绝对路径

同理realpathSync

/* 如果读取的时候不使用utf8参数,默认是使用buffer格式,也可以使用toString() 方法来转化为正常文字 */
var fs = require('fs');

fs.realpath('./test',function(err,path){
    if(err) console.log("err");
    else console.log(path);
})

 

utimes修改文件访问事件及修改时间

同理utimesSync

/* 如果读取的时候不使用utf8参数,默认是使用buffer格式,也可以使用toString() 方法来转化为正常文字 */
var fs = require('fs');

fs.utimes('./test',new Date(),new Date(),function(err){
    if(err) console.log("err");
    console.log("修改文件时间操作成功");
}) 

 

chmod修改文件或者目录的读写权限

同理chmodSync

/* 如果读取的时候不使用utf8参数,默认是使用buffer格式,也可以使用toString() 方法来转化为正常文字 */
var fs = require('fs');

// 0600 表示所有者可读写,其他人没有权限
fs.chmod('./test',0600,function(err){
     if(err) console.log("err");
     console.log("0600 表示所有者可读写,其他人没有权限");
})

// 0644 表示所有者可读写,其他人只读
fs.chmod('./test',0644,function(err){
     if(err) console.log("err");
     console.log("0644 表示所有者可读写,其他人只读");
})

// 0755 表示所有者有所有权限,其他人可读和执行
fs.chmod('./test',0755,function(err){
     if(err) console.log("err");
     console.log(" 0755 表示所有者有所有权限,其他人可读和执行");
})

// 0740 表示所有者有所有权限,所有者所在的组只读
fs.chmod('./test',0740,function(err){
     if(err) console.log("err");
     console.log("0740 表示所有者有所有权限,所有者所在的组只读");
})

 

rename 移动文件或者目录、重命名

同理renameSync

/* 如果读取的时候不使用utf8参数,默认是使用buffer格式,也可以使用toString() 方法来转化为正常文字 */
var fs = require('fs');

var files = fs.rename('./test.txt','./test/test.txt',function(err){
     if(err) console.log("err");
     console.log("文件操作成功");
})

 

删除文件夹

// 删除文件夹
function deleteall(path) {  
    var files = [];  
    if(fs.existsSync(path)) {  
        files = fs.readdirSync(path);  
        files.forEach(function(file, index) {  
            var curPath = path + "/" + file;  
            if(fs.statSync(curPath).isDirectory()) { // recurse  
                deleteall(curPath);  
            } else { // delete file  
                fs.unlinkSync(curPath);  
            }  
        });  
        fs.rmdirSync(path);  
    }  
};  

 

 

socket.io

安装socket

npm install socket.io --save  

我的demo(express版本):

"use strict";
const express = require('express');
const fs = require('fs');
const sio = require('socket.io');

let app = express();
app.get(
'',function(req,res){ res.end(fs.readFileSync('./index.html','utf8')); })
var server = app.listen(port, function () { console.log("Server Start!"); })
let socket
= sio.listen(server);
// 注意其他事件的绑定必须在connection的回调中 socket.on('connection',function(socket){
console.log(
"socket start!");
socket.send(
"hello world");
socket.on(
"message",function(msg){ console.log(msg); socket.send("server message send test"); })
socket.on(
'disconnect',function(){ console.log("the client is over"); })

    socket.on("myevent",function(data){
      console.log("the server is get client myevent:",data);
    })

 
  

    socket.emit('news',{newid:"123"});

})

 再准备一个index.html

<!DOCTYPE html>
<html>
  <head>
      <meta name="viewport" content="width=device-width, initial-scale=1,maximum-scale=1,user-scalable=no">
    <meta name="apple-mobile-web-app-capable" content="yes">
    <meta name="apple-mobile-web-app-status-bar-style" content="black">
    <meta charset="utf-8">
    <title>weicantimes</title>
    <script type="text/javascript" src="/socket.io/socket.io.js"></script>
  </head>
  <body>
    <div id="app">
        <router-view  keep-alive></router-view>
    </div>
  </body>
  <script type="text/javascript">
    console.log("index.html");
    var socket = io.connect();
    socket.on('message',function(msg){
      console.log(msg);
      // socket.send('client send message test');
    })
    socket.on('disconnect',function(){
      console.log('server over');
    })

    socket.emit("myevent",{name:"Lee"});
    
    socket.on("news",function(data){
      console.log("news:",data);
    })
  </script>
</html>

 如果是在VueJs中使用,则需要第三方模块:Vue-Socket.io

https://github.com/MetinSeylan/Vue-Socket.io

我的demo:

import VueSocketio from 'vue-socket.io';
Vue.use(VueSocketio, 'http://localhost:8090');

sockets : { connect : function(){ console.log('socket connected') }, client_menu : function(data){ console.log("client_menu",data) } } created () { this.$socket.emit("server_menu",{name:"test"}); }

 

 

人机交互

function readSyncByfs(tips) {
    tips = tips || '> ';
    process.stdout.write(tips);
    process.stdin.pause();

    const buf = Buffer.allocUnsafe(10000);
    let response = fs.readSync(process.stdin.fd, buf, 0, 10000, 0);
    process.stdin.end();

    return buf.toString('utf8', 0, response).trim();
}


var a = readSyncByfs('请输入任意字符:');
var a = readSyncByfs('');
console.log(a);

 

 

转载于:https://www.cnblogs.com/CyLee/p/5324984.html


http://www.niftyadmin.cn/n/934406.html

相关文章

海天味业从中国味到世界品牌的打造历程

海天味业从中国味到世界品牌的打造历程 根据国家统计局数据&#xff0c;2015年全国餐饮收入首次突破3万亿元&#xff0c;达到3.23万亿元&#xff0c;同比增长11.7%。其中限额以下单位餐饮收入2.36亿元&#xff0c;同比增长20.3%。2016年一季度餐饮业也将继续回暖&#xff0c;与…

HTTP/2 对 Web 性能的影响(上)

一.前言 HTTP/2 于 2015 年 5 月正式推出。自诞生以来&#xff0c;它就一直在影响着网络性能最佳实践。在本篇文章中&#xff0c;我们将讨论 HTTP/2 的二进制帧、延迟削减、潜在利弊以及相应的应对措施。 超文本传输协议&#xff08;简称 HTTP&#xff09;正是万维网与网络空间…

linux的write是线程安全的吗,Linux中writev()系统调用的原子性

我查看了Linux内核4.4.0-57-generic的内核源代码,在writev()源代码中没有看到任何锁定.有什么我想念的吗&#xff1f;我看不到writev()是原子还是线程安全的.解决方法:这里不是内核专家,但是无论如何我都会分享我的观点.随时发现任何错误.浏览内核(虽然我不希望v4.9如此不同),并…

实现下来ScrollView放大轮播图

创建工程&#xff0c;创建一个UIScrollView属性&#xff0c;并遵循其协议&#xff1b; #define kWidth self.view.frame.size.width//屏幕宽 #define kHeight self.view.frame.size.height//屏幕高 创建轮播图属性&#xff0c;&#xff08;也可以直接用UIImageView&#xff09;…

linux安装python的mayavi,Mayavi(python3.X)Linux的替代品

我试着用python3.5安装和使用Mayavi已经快一个星期了。不幸的是&#xff0c;我不能正确地使用它。起初&#xff0c;我很难在python3.5版本中安装它。现在&#xff0c;我终于成功了&#xff0c;代码根本没有显示出图。它会立即打开和关闭窗口&#xff0c;我想我正在使用的操作系…

使用flask开发网站后端

Flask 是一个用于 Python 的微型网络开发框架&#xff0c;可以用于快速的搭建一个小型的网站。 我的搜索引擎:http://www.abelkhan.com 就是基于flask开发 一个flask的Hello World from flask import Flask app Flask(__name__)app.route(/) def hello_world():return Hello W…

web前段总结

1.rel"stylesheet" 告诉浏览器你将采用一个样式表文件,简单来说就是告诉浏览器你将采用什么编码来对下面的内容进行处理 (不写引用是css文件不起作用) 2.css文件编辑中不要在属性值与单位之间留有空格&#xff1a;假如你使用 "margin-left: 20 px" 而不是 …

天津大学仁爱学院教务网、图书馆以及数字化平台网址

天津大学仁爱学院教务网&#xff1a;http://jw.tjrac.edu.cn/ 天津大学仁爱学院数字化平台&#xff1a;http://jw.tjrac.edu.cn/bm 天津大学仁爱学院图书馆&#xff1a; http://121.193.129.2:8080/opac/search.php转载于:https://www.cnblogs.com/zhangfeionline/p/5310291.ht…