node基础
1、node本地化日志
//本地化日志及按日期切割
const winston = require('winston');
require('winston-daily-rotate-file');
var transport = new winston.transports.DailyRotateFile({
filename: 'logs/console-%DATE%.log',
datePattern: 'YYYY-MM-DD-HH',
zippedArchive: true,
maxSize: '20m',
maxFiles: '14d'
});
const logConfiguration = {
transports: [
transport
// new winston.transports.File({
// filename: 'logs/console.log'
// })
],
format: winston.format.combine(
winston.format.label({
label: `HealthTimerTask `
}),
winston.format.timestamp({
format: 'MMM-DD-YYYY HH:mm:ss'
}),
winston.format.printf(info => `${info.level}: ${info.label}: ${[info.timestamp]}: ${info.message}`),
)
};
const logger = winston.createLogger(logConfiguration);
module.exports = logger
2、node表格处理
npm install excel-report
var nodeExcel = require('excel-export');
//处理excel
var conf = {}
conf.stylesXmlFile = "styles.xml";
conf.cols = [{
caption: '姓名',
type: 'string',
beforeCellWrite: function (row, cellData) {
console.log(row)
console.log(cellData)
return cellData;
},
width: 18.7109375
},
{
caption: '身份证',
type: 'string',
beforeCellWrite: function (row, cellData) {
return cellData;
},
width: 28.7109375
},
{
caption: '电话',
type: 'string',
beforeCellWrite: function (row, cellData) {
return cellData;
},
width: 18.7109375
},
{
caption: '持卡人信息',
type: 'string',
beforeCellWrite: function (row, cellData) {
return cellData;
},
width: 18.7109375
},
{
caption: '开户卡地址',
type: 'string',
beforeCellWrite: function (row, cellData) {
return cellData;
},
width: 28.7109375
},
{
caption: '银行卡号',
type: 'string',
beforeCellWrite: function (row, cellData) {
return cellData;
},
width: 28.7109375
},
{
caption: '提交退款日期',
type: 'string',
beforeCellWrite: function (row, cellData) {
return cellData;
},
width: 18.7109375
}
];
conf.rows = [];
for(var i=0;i<result2.length;i++){
var obj = [
result2[i].name,
result2[i].id_number,
result2[i].mobile_phone,
result2[i].bank_card_holder,
result2[i].bank_detail_address,
result2[i].other_contact,
result2[i].refund_date
]
conf.rows.push(obj)
}
var result = nodeExcel.execute(conf);
res.setHeader('Content-Type', 'application/vnd.openxmlformats');
res.setHeader("Content-Disposition", "attachment; filename=" + "Report.xlsx");
res.end(result, 'binary');
3、node 作为微服务注册到consul,获取和设置值
const Consul = require('consul');
var serviceName = 'node-parse-url'
const consul = new Consul({
host: '1**.2*.4.47',
port: 8500,
promisify: true,
});
consul.agent.service.register({
name: serviceName,
address: '1**.**.5.10',
port: 3000,
check: {
http: 'http://1**.1*.5.10:3000/health',
interval: '10s',
timeout: '5s',
}
}, function (err, result) {
if (err) {
console.error(err);
throw err;
}
console.log(serviceName + ' 注册成功!');
})
consul.kv.get('zgt').then((result) => {
if (result && result.Value) {
if (result.Value == 'on') {
res.send({ status: 200, data: true })
} else {
res.send({ status: 200, data: false })
}
} else {
res.send({ status: 200, data: false })
}
})
4、node 限流
const slowDown = require("express-slow-down");
// 1个ip,1s内最多相应5个请求,超出5个就排队等待吧
const speedLimiter = slowDown({
windowMs: 1000,//1s
delayAfter: 2, // 最多2个请求
delayMs: 2000 // 超2后延后2s后排队
});
app.use(speedLimiter);
5、node 在线文档
1、全局安装
npm i -g apidoc
2、在node项目根目录下创建apidoc.json文件
{
"name": "node-server",
"version": "1.0.0",
"description": "node-server项目API文档",
"title": "node-server API",
"url1" : "http://1**.1*.5.6:8081/",
"url" : "http://localhost:8081/",
"sampleUrl": "http://localhost:8081/",
"forceLanguage":"zh-cn",
"template": {
"withCompare": true,
"withGenerator": true
}
}
3、配置
指定静态资源文件夹
server.use('/apidoc',express.static('public'));
4、在接口处添加规则
/**
* 查询公司信息是否存在
* @api {POST} user/checkCompanyExists 查询公司信息是否存在
* @apiDescription 查询公司信息是否存在
* @apiName checkCompanyExists
* @apiBody (body参数) {String} company_name
* @apiBody (body参数) {String} mobile_phone
* @apiGroup user
* @apiVersion 1.0.0
*/
router.post('/checkCompanyExists', (req, res) => {}))
6、操作redis
const redis = require('redis');
// todo
const config = {
url:'1**.1*.5.6',
port:6379,
password:''
}
const client = redis.createClient(config.port, config.url); // 实例redis对象
//连接错误处理
client.on("error", err => {
console.log('redis connect err', err);
});
client.on('connect', () => {
console.log('redis connect success');
})
//验证redis
client.auth(config.password);
const redisHelper = {};
/**
* redisHelper setString function
* @param key
* @param value
* @param expire
*/
redisHelper.setString = (key, value, expire) => {
return new Promise((resolve, reject) => {
client.set(key, value, function (err, result) {
if (err) {
console.log(err);
reject(err);
}
if (!isNaN(expire) && expire > 0) {
client.expire(key, parseInt(expire));
}
resolve(result)
})
})
}
/**
* redisHelper getString function
* @param key
*/
redisHelper.getString = (key) => {
return new Promise((resolve, reject) => {
client.get(key, function (err, result) {
if (err) {
console.log(err);
reject(err)
}
resolve(result)
});
})
}
module.exports = redisHelper;
7、node处理express请求参数
get请求携带参数:
方式1: http://localhost:3000/detail?id=1
req.query.id
方式2: http://localhost:3000/oc/10
app.get('/oc/:myid',()=>{})
req.params.myid
post请求携带参数:
方式1:
var querystring = require('querystring');
app.post('/login',(req,res)=>{
req.on('data',(buf)=>{
var obj = querystring.parse(buf.toString());
obj.***
})
})
8、node发短信
var uuid = require('node-uuid');
var crypto = require('crypto');
var moment = require('moment');
var http = require('http');
var alidayuUrl = 'http://dysmsapi.aliyuncs.com/';
// var OPAPI = require('opapi');
var config = {
AppKey: '',
AppSecret: ''
};
var obj = {
AccessKeyId: config.AppKey,
Action: 'SendSms',
Format: 'JSON',
PhoneNumbers: '',
RegionId: 'cn-hangzhou',
SignName: '',
SignatureMethod: 'HMAC-SHA1',
SignatureNonce: uuid.v1(),
SignatureVersion: '1.0',
TemplateCode: 'SMS_1769409**',
TemplateParam: '{"code":"123456"}',
Timestamp: '',
Version: '2017-05-25'
}
var sms = {
NORMAL_TEMPPLATE: 'SMS_787700**',
REGISTER_TEMPLATE: 'SMS_759952**',
CHANGEPROJECT_TEMPLATE: 'SMS_759952**',
FORGETPASSS_TEMPLATE: 'SMS_759952**',
sendMessage: function (phone, TemplateCode, TemplateParam, callback) {
var sendurl = this.url(phone, TemplateCode, TemplateParam);
var req = http.request(sendurl, function (res) {
var status = res.statusCode;
if (status != 200) {
callback(new Error('网络异常'));
}
res.setEncoding('utf8');
res.on('data', function (chunk) {
var value = JSON.parse(chunk);
if (value.Code != 'OK') {
console.log(chunk);
callback(new Error('短信发送异常'));
} else {
callback(null);
}
}).on('error', function (e) {
callback(new Error('发送短信异常'));
});
});
req.write('执行完毕');
req.end();
},
sign: function (params, accessSecret) {
var param = {}, qstring = [];
var oa = Object.keys(params);
for (var i = 0; i < oa.length; i++) {
param[oa[i]] = params[oa[i]];
}
for (var key in param) {
qstring.push(encodeURIComponent(key) + '=' + encodeURIComponent(param[key]));
}
qstring = qstring.join('&');
var StringToSign = 'GET' + '&' + encodeURIComponent('/') + '&' + encodeURIComponent(qstring);
accessSecret = accessSecret + '&';
var signature = crypto.createHmac('sha1', accessSecret).update(StringToSign).digest().toString('base64');
signature = signature.replace(/\*/, '%2A').replace(/%7E/, '~');
return signature;
},
url: function (phone, TemplateCode, TemplateParam) {
var timestamp = moment(new Date().getTime() - 3600 * 1000 * 8).format("YYYY-MM-DDTHH:mm:ss") + 'Z';
obj.PhoneNumbers = phone;
obj.SignatureNonce = uuid.v1();
obj.TemplateCode = TemplateCode;
obj.TemplateParam = TemplateParam;
obj.Timestamp = timestamp;
var sign = this.sign(obj, config.AppSecret);
var arr = [];
for (var p in obj) {
arr.push(encodeURIComponent(p) + '=' + encodeURIComponent(obj[p]));
}
arr.push(encodeURIComponent('Signature') + '=' + encodeURIComponent(sign))
var msg = arr.join('&')
var sendurl = alidayuUrl + '?' + msg;
return sendurl;
}
}
module.exports = sms;
9、node操作es
//express结合es操作
var elasticsearch = require('elasticsearch');
var elasticClient = new elasticsearch.Client({
host: '1**.1*.5.48:9200'
});
app.listen(4200,()=>{
console.log("server starts in port 4200")
})
app.get("/estest",(req,res)=>{
elasticClient.search({
index: req.query.index
}) .then(function (response) {
var hits = response.hits.hits;
console.log(response);
res.send(response)
});
})
var elasticsearch = require('elasticsearch');
var elasticClient = new elasticsearch.Client({
host: '1**.**.5.4*:9200'
});
var searchInfo = {
index: "news_tong",
body: {
query: {
match_phrase: {
id: "20211213-00022"
}
},
_source: ["author", "typeName", "title", "publishTime", "intro", 'isTop'],
}
}
var updateInfo = {
index: "news_tong",
body: {
query: {
match_phrase: {
id: "20211213-00022"
}
},
script: {
"source": "ctx._source['isTop'] = params['one']",
"params": {
"one": true,
}
}
}
}
var test = async function (searchInfo) {
var response = await elasticClient.search(searchInfo)
if (response.hits.total > 0) {
console.log('数据存在 isTop is ', response.hits.hits[0]._source.isTop);
//更新
if (response.hits.hits[0]._source.isTop == false) {
var response2 = await elasticClient.updateByQuery(updateInfo)
if (response2.updated >= 1) {
console.log('更新成功')
} else {
console.log('更新失败')
}
process.exit(0)
} else {
console.log('无须更新')
process.exit(0)
}
} else {
console.log('数据不存在')
process.exit(0)
}
}
test(searchInfo)
10、node发邮件
var email = require("emailjs");
console.log(email)
var client = new email.SMTPClient({
user: "", // 你的QQ用户
password:"", // 注意,不是QQ密码,而是刚才生成的授权码
host: "smtp.mxhichina.com", // 主机,不改
ssl: true // 使用ssl
});
var mail = {}
//开始发送邮件
mail.sendMail = (text,to,subject,callback)=>{
client.send({
text: text, //邮件内容
from: "", //谁发送的
to: to, //发送给谁的
subject: subject //邮件主题
}, callback );
}
module.exports = mail;

浙公网安备 33010602011771号