情况如上图, 我给req.userInfo添加了isAdmin属性, 而下面的却找不到呢…很是摸不着头脑 大神帮帮我吧, 我快要被这问题困住一天了…!
用express框架,做管理员验证功能碰到的坑,大神帮帮我吧
NodeJs 12306-cli购票相关研究(登录已完成,购票正在完善中...)
半自动登录效果展示(可能是gif比较大在safari中效果不好,比较慢,请在chrome中查看):
编程语言为NodeJs和Java,Java只实现了验证码展示的GUI。
代码地址https://github.com/MedusaLeee/12306
目前这个项目其实是一个原型项目,用于整理和测试购票相关技术。
实现计划:
- 半自动命令行购票(手动输入验证码);
- 全自动命令行购票(验证码自动识别,计划是使用打码兔,自己也研究过使用OCR或者百度识图进行识别,但准确率不够);
- 使用
Commander
封装为命令行工具,包括登录
、查票
、下单
,自动刷票
。
目前已完成半自动登录。
这里分享出来主要是想和大家交流下想法。有什么好的点子或者问题可以在帖子里面讨论下。代码实现或者写的不好的地方还请大家指正。
一个基于豆瓣API的书架借阅平台
一个做完好久的玩意儿,今天想起传到github上,请各位指教
前端:https://github.com/yuu2lee4/library_fe后端:https://github.com/yuu2lee4/library_be
nodejs开发调试微信公众号总结
这篇文章简单介绍了基于node包wechat和wechat-api进行微信公众号开发和基于内网穿透技术的本机调试,想要了解如何用nodejs从头开发微信公众号的童鞋请戳这篇文章。 wechat和wechat-api区别在它们github上也描述得很清楚,前者是微信的消息接口的中间件,负责一些消息交互,而后者提供了微信平台上的更多api,其中的JS-SDK的支持比较常用,稍后会介绍。
一、登录测试号
既然要开发微信公众号,那么得有公众号才行,开发期间不必申请正式的公众号,微信提供了测试账号。
二、消息中间件配置
wechat的具体用法很简单,看文档即可,这里主要介绍对应的接口配置信息图和填写:
这里的URL必须是微信平台能够访问到的,也就是必须是一个公网地址,即便有公网服务器,代码已有改动就要上传至服务器,也很是繁琐,所以此时就可以用内网穿透技术将一个公网地址映射到本机地址,内网穿透的方法有很多,也有很多现成的软件提供支持,比如花生壳、ngrok,我这里介绍的是ngrok,ngrok安装好后,运行ngrok http 本地端口号即可完成映射:
此时将对应的地址和token填入配置里提交即可:
Tip: 也可以用国内的ngrok服务,比如sunny-ngrok
三、API中间件配置
这里需要配置两个地方,JS接口安全域名和网页服务里的网页账号的修改,地址都是前端访问的地址,然后后端需要提供一个接口供前端验证,这个具体看微信JSSDK文档和中间件的getJsConfig方法,然后调试需要用到微信开发者工具,也可以在线校验合法性,以Koa为例,提供验证接口的代码如下:
const WechatAPI = require('co-wechat-api');
const Router = require('koa-router');
const router = new Router();
const appid = 'wxfde88c18aee20f23';
const appsecret = '021c91f5b0f0a9a08ac1583425240f00';
const wxapi = new WechatAPI(appid, appsecret);
router.get('/getSignature', async (ctx) => {
const res = await wxapi.getJsConfig({
url: ctx.request.header.referer,
});
ctx.body = {
code: 0,
data: res,
};
});
在pc端开发完前端之后,需要在手机上进行测试,第一步当然是需要设置公众号的一个菜单,具体看createMenu这个方法,准备一个js文件专门用于菜单的更新,每次更新的时候,运行一下这个文件即可,代码如下:
const WechatAPI = require('co-wechat-api');
const appid = 'wxfde88c18aee20f23';
const appsecret = '021c91f5b0f0a9a08ac1583425240f00';
const wxapi = new WechatAPI(appid, appsecret);
const menuConfig = {
"button":[
{
"type":"click",
"name":"今日歌曲",
"key":"V1001_TODAY_MUSIC"
},
{
"name":"菜单",
"sub_button":[
{
"type":"view",
"name":"搜索",
"url":"http://www.soso.com/"
},
{
"type":"click",
"name":"赞一下我们",
"key":"V1001_GOOD"
}]
}]
}
]
};
wxapi.createMenu(menuConfig).then((res) => {
console.log(res);
});
至于手机如何访问电脑上的地址,就很简单了,将手机与电脑置于同一网络当中,利用一些代理工具比如charles进行代理就行了。
不知道怎么回事,调不通,大神进来看看哈!
不知道怎么回事,反正就是死活调不通。
求助,npm安装express时出错!
![B_69HL]S98PXT$($I4WC`~3.png](//dn-cnode.qbox.me/FoM6fbkogeifPYwf06EZVn3fqAPM) 请问怎么解决呢?
Node phantomjs 如何获取页面中 iframe 中的 html
使用 Nodejs 进行抓取页面的时候,js 等都可以运行,但是页面中包含一个 iframe,输出抓取的 html 的时候,iframe 中是空的,没有 dom。用的包是 Node-phantomjs。
[南京]【苏宁总部】前端开发部招聘研发工程师(3年以上经验,React/Vue方向,10-25k)
工作地点:[南京·徐庄]
职位类型: web前端开发
薪资: 10-25k(主要还是看能力!)
岗位要求:
1、熟练掌握DIV+CSS、并且对模块化有一定理解,熟悉HTML5、CSS3、ES5/ES6;
2、熟练掌握JavaScript语言核心技术DOM、BOM、Ajax、JSON等,对javascript框架(如Jquery、YUI、Extjs等)源码有一定的了解;
3、熟练使用Vue或React等前端相关技术框架;
4、对css/js性能优化、浏览器兼容性问题有一定的经验;对代码的可维护性、组件的易用性、分层语义模板和浏览器兼容性有一定了解;
5、掌握大数据可视相关开发技术如SVG、Canvas、D3.js、Three.js、Echarts等优先考虑;
6、具有良好的沟通能力和团队合作精神、解决问题的能力,注重规范化开发;
7.3 年以上的前端开发经验
关键词:JS、React、Vue、数据可视化、Webpack
简历投放:291003932@qq.com/18724009609
狼叔的书什么时候出啊
……
深圳智播科技招聘兼职前端动画开发
工作地点: 兼职远程就可以 技能的要求: 主要是前端js动画, 能用tween.js最好, 一个动画内容不会大多 工作内容: 按照指定的需求,开发动画效果 工作待遇:按件付费 联系方式: superway_build@hotmail.com
Egg.js 深入浅出学习笔记 (每周一更)
Egg.js 深入浅出学习笔记 (每周一更)
传送门
前言
去年(2017)的这个时候写过一本 《Koa2进阶学习笔记》,主要demo+讲解的方式解读 Koa.js 2.x 的快速学习使用。
看了Egg.js 的官方文档 https://eggjs.org/,发现使用教程已经很完善,无需再写相关的使用教程。然而,市面上分析Egg.js底层实现的资料却是比较少,因此,现在也同样以demo的形式来从零讲解Egg.js的内部实现逻辑,主要讲解内容有以下两点。
- 从Egg.js源码解读 Koa.js 的高阶使用
- 以Koa.js为基础从零开始分析Egg.js
写这本电子书的目的有
- 研究 Egg.js 源码
- 及时归纳学习过程
- 让自己立flag每周一更,锻炼文档能力
交流
在开始动笔这本开源电子书时,前期断断续续地阅读了Egg.js源码,现在处于列提纲和起步编写阶段,难免有些纰漏或错误,如有错误欢迎提出。
- 欢迎提出建议一起学习 Koa.js的高阶使用
- 欢迎对本书及demo提PR
- 交流请移步 issue
目录
- Egg.js深入浅出学习笔记
- 致读者
- egg体系简析
- 最小系统
- 最小WEB系统
- Egg.js最小系统
- Egg.js模块归类
- Egg.js路由增强
- Egg.js最简加载器
- 核心体系egg-core
- 源码结构解析
- 实用内置工具
- Loader机制
- Plugin加载实现
- Config加载实现
- Extend加载实现
- Custom加载实现
- Service加载实现
- Middleware加载实现
- Controller加载实现
- Router加载实现
- 辅助体系
- 启动流程
- 开发模式实现
- 调试模式实现
- 生产模式实现
- 测试模式实现
- 生态体系
- 中间件
- 插件
- 框架
- 其他
- 待整理…
面试官: 你了解过Babel吗?写过Babel插件吗? 答: 没有。卒
也就前两天,面试大厂,其中更有那么一个问题:
- 你了解过Babel吗?
了解过抽象语法树,又称AST,有学习过,也写过一个基于AST的乞丐版模板引擎,先是词法解析token,然后生产抽象语法树,然后更改抽象语法树,当然这是插件做的事情,最后根据新的AST生成代码。
- 写过Babel插件吗
没有,只是看过相关文档
- 如果让你写一个插件,你能写的出来吗?
应该可以吧…
遂卒…
开玩笑的,既然提到了,又没回答上来什么,哎哟我这暴脾气,一想到今晚就睡不着,连夜把它撸了。
那么我们来从零写个插件吧。
写一个预计算简单表达式的插件
预览
Before:
const result = 1 + 2 + 3 + 4 + 5;
After:
const result = 15;
以上的例子可能大家不会经常遇到,因为傻x才会这么写,但是有可能你会这么写
setTimeout(function(){
// do something
}, 1000 * 2) // 插件要做的事,就是把 1000 * 2 替换成 2000
前提条件
开工
再写代码之前,你需要明白Babel它的原理,简单点说: Babel解析成AST,然后插件更改AST,最后由Babel输出代码
那么Babel的插件模块需要你暴露一个function,function内返回visitor
module.export = function(babel){
return {
visitor:{
}
}
}
visitor是对各类型的AST节点做处理的地方,那么我们怎么知道Babel生成了的AST有哪些节点呢?
很简单,你可以把Babel转换的结果打印出来,或者这里有传送门: AST explorer
这里我们看到 const result = 1 + 2
中的1 + 1
是一个BinaryExpression
节点,那么在visitor中,我们就处理这个节点
var babel = require('babel-core');
var t = require('babel-types');
const visitor = {
BinaryExpression(path) {
const node = path.node;
let result;
// 判断表达式两边,是否都是数字
if (t.isNumericLiteral(node.left) && t.isNumericLiteral(node.right)) {
// 根据不同的操作符作运算
switch (node.operator) {
case "+":
result = node.left.value + node.right.value;
break
case "-":
result = node.left.value - node.right.value;
break;
case "*":
result = node.left.value * node.right.value;
break;
case "/":
result = node.left.value / node.right.value;
break;
case "**":
let i = right;
while (--i) {
result = result || node.left.value;
result = result - node.left.value;
}
break;
default:
}
}
// 如果上面的运算有结果的话
if (result !== undefined) {
// 把表达式节点替换成number字面量
path.replaceWith(t.numericLiteral(result));
}
}
};
module.exports = function (babel) {
return {
visitor
};
}
插件写好了,我们运行下插件试试
const babel = require("babel-core");
const result = babel.transform("const result = 1 + 2;",{
plugins:[
require("./index")
]
});
console.log(result.code); // const result = 3;
与预期一致,那么转换 const result = 1 + 2 + 3 + 4 + 5;
呢?
结果是: const result = 3 + 3 + 4 + 5;
这就奇怪了,为什么只计算了1 + 2
之后,就没有继续往下运算了吗?
我们看一下这个表达式的AST树
你会发现Babel解析成表达式里面再嵌套表达式。
表达式( 表达式( 表达式( 表达式(1 + 2) + 3) + 4) + 5)
而我们的判断条件并不符合所有的,只符合1 + 2
// 判断表达式两边,是否都是数字
if (t.isNumericLiteral(node.left) && t.isNumericLiteral(node.right)) {}
那么我们得改一改
第一次计算1 + 2
之后,我们会得到这样的表达式
表达式( 表达式( 表达式(3+ 3) + 4) + 5)
其中 3 + 3
又符合了我们的条件, 我们通过向上递归的方式遍历父级节点
// 如果上面的运算有结果的话
if (result !== undefined) {
// 把表达式节点替换成number字面量
path.replaceWith(t.numericLiteral(result));
let parentPath = path.parentPath;
// 向上遍历父级节点
parentPath && visitor.BinaryExpression.call(this, parentPath);
}
到这里,我们就得出了结果 const result = 15;
那么其他运算呢:
const result = 100 + 10 - 50
>>> const result = 60;
const result = (100 / 2) + 50
>>> const result = 100;
const result = (((100 / 2) + 50 * 2) / 50) ** 2
>>> const result = 9;
完结
到这里,已经向你大概的讲解了,如果编写一个Babel插件,再也不怕面试官问我答不出什么了哈…
你以为这就完了吗?
并没有
如果转换这样呢: const result = 0.1 + 0.2;
预期肯定是0.3
, 但是实际上,Javascript有浮点计算误差,得出的结果是0.30000000000000004
那是不是这个插件就没卵用?
这就需要你去矫正浮点运算误差了,可以使用Big.js;
比如: result = node.left.value + node.right.value;
改成 result = +new Big(node.left.value).plus(node.right.value);
你以为完了吗? 这个插件还可以做很多
比如: Math.PI * 2
>>> 6.283185307179586
比如: Math.pow(2,2)
>>> 4
…
…
最后上项目地址: https://github.com/axetroy/babel-plugin-pre-calculate-number
meteor.js 在windows 上真的可以安装??
主要是windows
使用sequelize的upsert方法后 自增id都会加1
使用sequelize的upsert方法后 自增id都会加1 ,求助这个问题如何解决?
使用express怎么判断response连接断开
使用express怎么判断response连接断开 需要在连接断开时停止后台操作,所以需要获取response连接状态
用 js 遍历数组,然后调用 python 脚本处理数组元素,但得到的结果却是乱序的
1. 代码:
1.1 js脚本
// call_py.js
// 制作数组
var s1="1 What makes Rails so great?"
var s2 = "2 do you love me still ?"
var s3 = "3 The Ruby on Rails Tutorial is designed to give you a thorough introduction to web application developmentntrepreneur."
var s4 = "4 of course i still love you . "
var list=[s1,s2,s3,s4]
// 子进程
var exec = require('child_process').exec;
// 遍历数组
let iterable = list
for(let value of iterable)
{
exec('python py_test.py '+value+' ',function(error,stdout,stderr)
{
if(error){
console.log(stderr)
}else{
console.log(stdout)
}
}
)
}
1.2 python脚本:
# py_test.py
import sys
script = sys.argv
print script
1.3 输出的结果:
['py_test.py', '1', 'What', 'makes', 'Rails', 'so', 'great?']
['py_test.py', '2', 'do', 'you', 'love', 'me', 'still', '?']
['py_test.py', '3', 'The', 'Ruby', 'on', 'Rails', 'Tutorial', 'is', 'designed', 'to', 'give', 'you', 'a', 'thorough', 'introduction', 'to', 'web', 'application', 'developmentntrepreneur.']
['py_test.py', '4', 'of', 'course', 'i', 'still', 'love', 'you', '.']
2.疑问:
2.1 问题一:
- 为什么输出的结果不是按照数组的顺序来的,而是乱序的?
- 怎样才能输出按照数组顺序的结果?
2.2 问题二:
- 因为我在js脚本的第18行用的是
'python py_test.py '+value+''
,所以我觉得应该是将value
作为一个值传递给python脚本,但是实际输出结果却显示是拆分成了很多个词,然后变成了很多个值?
async/await与for循环遍历
遇到了在for循环中,使用await函数的情况,但是打断点调试后发现得到的还是Promise{pending},有考虑闭包的问题,使用了匿名函数带参数的写法,还是不能解决,每次单步调试的时候await函数那里会自动跳过,代码如下,请熟悉这方面的朋友给点意见,指明一个研究方向,谢谢。
var query = models.DuoBaoPlayer.find(q, '').sort('-_id').skip(skipFrom).limit(limit);
query.exec(function(err, doc) {
var dataList = [];
async function findOneDuobao(item) {
let doc = await models.DuoBao.findOne({id:item.sid}, 'title startTime endTime luckys totalTime haveTime winner'); //mongoose
return doc;
}
for (let i = 0; i < doc.length; i++) {
dataList.push((async function (num) {
let data1 = doc[num].toObject();
let data2 = await findOneDuobao(doc[num]); //每次单步调试的时候都会自动跳过
let data = Object.assign(data1, data2);
return data;
})(i));
}
let testDataList = dataList; //return 两个 Promise { pending }
}
React Native 开发CNode客户端
经过半个月的开发终于把CNode客户端基本开发完毕了,性能优化也基本上做完了!APP 跑起来没啥大问题了。目前支持一下功能
手动输入token 登录二维码登录更换皮肤主题列表主题详情主题评论主题刷新、分享、在浏览器中打开评论列表展示评论刷新、评论回复个人资料查看退出登录功能消息列表小尾巴图片预览、下载
项目截图
Android
IOS
如果你觉得本项目对你有帮助,请帮作者star。作者是前端小白一名。如果有写错的地方请指正,谢谢! 传送门
mysql的基本操作
“”"
字段类型:
数字: int(整数) decimal(小数)
decimal(5,2) 总共五位数,包含两位小数
字符串:
char 有限
varchar 有限
text 无限
char和varchar的区别
char存的字符是固定的
varchar存的字符是不固定的
字符编码问题
gb2312(国标)
utf8(国际通用的标准)
日期:
datetime
布尔:
bit
“”"
“”“ 约束: 主键:primary key 非空:not null 唯一:unique 默认:default 外键:foreign key ”""
“”“ 逻辑删除 1.对于重要的数据,并不希望物理删除,一旦删除,数据无法找回 2.一般对于重要数据,会设置一个isDelete的列,类型为bit,表示逻辑删除 3.对于大量增长的非重要数据,可进行物理删除 4.数据的重要性,要根据实际开发决定 ”""
“”" 操作库 创建数据库 create database 数据库名 charset=utf8; 查看当前选择的数据库 show databases 删除数据库 drop database 数据库名 切换数据库 use 数据库名 查看当前用的是哪个数据库 select database()
表操作
查看当前的数据库中的所有表
show tables
创建表
create table 表名(列及类型)
自动增长
auto_increment
主键
primary key
非空
not null
create table students(
id int auto_increment primary key not null,(主键)
name varchar(10) not null,
sex bit default 1,
birthday datatime
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
查看表:
desc 表名字
修改表:
alter table 表名 add|change|drop 列名 类型;
alter table students add isDetele bit default 0;
删除表:
drop table 表名
更改表名称
rename table 原表名 to 新表名
查看创建表的语法
show create table ‘表名’
"""
“”“
数据操作
查询
select * from 表名
增加
全列插入:
insert into 表名 values(0,‘skl’,1,‘1990-1-1’,0);
insert into 表名(‘字段’) values(‘值’);
insert into 表名(‘字段’) values(‘哈哈’),(‘哈哈1’),(‘哈哈2’);
修改
update 表名 set (字段)birthday=‘1995-12-30’ where id=2
删除
delete from 表名 where id=3
逻辑删除 相当于 update
”""
“”" 备份与恢复 数据备份 进入超级管理员 sudo -s 进入mysql库目录 cd /var/lib/mysql 运行mysqldump命令 mysqldump -uroot -p 数据库名 >~/desktop/备份文件.sql 数据恢复 mysql -uroot -p 库名 < 迁移.sql
“”"
[深圳] 游戏公司招聘 Node.js 开发工程师 1名!入职标配MacBookPro,快来吧!!!
深圳市一花科技有限公司 招聘 【Node.js 开发工程师】 **主要工作职责: ** 1.在规定时间内完成开发产品提出的新功能; 2.配合前端开发,设计接口完成功能需求; 3.维护日常游戏版本稳定; 4.修复日常玩家反馈的BUG; 5.完善日常游戏数据统计
任职资格要求: 1.熟悉NodeJS技术,熟悉V8; 2.熟悉RESTFUL,了解TCP/IP、SOCKET、WEB SOCKET通讯协议; 3.熟悉Mysql数据库,熟悉Redis、memcached等缓存优化; 4.熟练使用linux,熟悉linux shell编程,能在linux下进行Node开发和部署; 5.1年以上工作经验,具有应用程序框架的设计开发经验,对异步处理有深刻理解; 6.参与过上线游戏项目,且在github上有自己repo优先; 7.具有独立解决问题的能力。
关于我们:深圳市一花科技有限公司(一花科技:http://www.yiihua.com)专注于手机游戏和网页游戏开发与运营。公司成立于2012年初,位于深圳南山区。一花科技的公司名字寓意为“一花一世界”,即我们致力于将每个游戏打造为一个独立完整的世界,通过自研 发卓越体验的游戏和深入的运营,为用户提供游戏、娱乐、交友等体验。目前我们已经打造了《一花德州扑克》、《牛牛》、《斗地主》等游戏,在日本、泰国、印尼、美国、中国香港、中国台湾等近十个国家和地区成功运营。 2016年9月份, 一花科技获天神娱乐斥资9.86亿元人民币全资收购,踏上新的发展旅程! 地点:深圳市南山区科技中三路一号海王银河科技大厦18层 加入我们:弹性上班、六险一金、周末双休、年终双薪、项目奖金、技能培训、图书津贴、午餐补贴、团建活动多多、老板nice、技术氛围好! 我们期待每一位有才干、有梦想的伙伴加入,跟我们一起扬帆起航! 联系我们:联系人:Tia 电话:0755-86531536 邮箱:linlvting@yiihua.com 公司:深圳市一花科技有限公司 地址:深圳市南山区科技中三路一号海王银河科技大厦18层