Quantcast
Channel: CNode:Node.js专业中文社区
Viewing all 14821 articles
Browse latest View live

用express框架,做管理员验证功能碰到的坑,大神帮帮我吧

$
0
0

1.jpg情况如上图, 我给req.userInfo添加了isAdmin属性, 而下面的却找不到呢…很是摸不着头脑 大神帮帮我吧, 我快要被这问题困住一天了…!


NodeJs 12306-cli购票相关研究(登录已完成,购票正在完善中...)

$
0
0

半自动登录效果展示(可能是gif比较大在safari中效果不好,比较慢,请在chrome中查看):

image

编程语言为NodeJs和Java,Java只实现了验证码展示的GUI。

代码地址https://github.com/MedusaLeee/12306

目前这个项目其实是一个原型项目,用于整理和测试购票相关技术。

实现计划:

  1. 半自动命令行购票(手动输入验证码);
  2. 全自动命令行购票(验证码自动识别,计划是使用打码兔,自己也研究过使用OCR或者百度识图进行识别,但准确率不够);
  3. 使用Commander封装为命令行工具,包括登录查票下单自动刷票

目前已完成半自动登录。

这里分享出来主要是想和大家交流下想法。有什么好的点子或者问题可以在帖子里面讨论下。代码实现或者写的不好的地方还请大家指正。

一个基于豆瓣API的书架借阅平台

nodejs开发调试微信公众号总结

$
0
0

       这篇文章简单介绍了基于node包wechatwechat-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进行代理就行了。

不知道怎么回事,调不通,大神进来看看哈!

$
0
0

image.png不知道怎么回事,反正就是死活调不通。

求助,npm安装express时出错!

Node phantomjs 如何获取页面中 iframe 中的 html

$
0
0

使用 Nodejs 进行抓取页面的时候,js 等都可以运行,但是页面中包含一个 iframe,输出抓取的 html 的时候,iframe 中是空的,没有 dom。用的包是 Node-phantomjs。

[南京]【苏宁总部】前端开发部招聘研发工程师(3年以上经验,React/Vue方向,10-25k)

$
0
0

工作地点:[南京·徐庄]

职位类型: 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


狼叔的书什么时候出啊

深圳智播科技招聘兼职前端动画开发

$
0
0

工作地点: 兼职远程就可以 技能的要求: 主要是前端js动画, 能用tween.js最好, 一个动画内容不会大多 工作内容: 按照指定的需求,开发动画效果 工作待遇:按件付费 联系方式: superway_build@hotmail.com

Egg.js 深入浅出学习笔记 (每周一更)

$
0
0

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

eggjs-note-360.png

目录

面试官: 你了解过Babel吗?写过Babel插件吗? 答: 没有。卒

$
0
0

也就前两天,面试大厂,其中更有那么一个问题:

  1. 你了解过Babel吗?

了解过抽象语法树,又称AST,有学习过,也写过一个基于AST的乞丐版模板引擎,先是词法解析token,然后生产抽象语法树,然后更改抽象语法树,当然这是插件做的事情,最后根据新的AST生成代码。

  1. 写过Babel插件吗

没有,只是看过相关文档

  1. 如果让你写一个插件,你能写的出来吗?

应该可以吧…

遂卒…

开玩笑的,既然提到了,又没回答上来什么,哎哟我这暴脾气,一想到今晚就睡不着,连夜把它撸了。

那么我们来从零写个插件吧。

写一个预计算简单表达式的插件

预览

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

1

这里我们看到 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树

2

你会发现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 上真的可以安装??

使用sequelize的upsert方法后 自增id都会加1

$
0
0

使用sequelize的upsert方法后 自增id都会加1 ,求助这个问题如何解决?

使用express怎么判断response连接断开

$
0
0

使用express怎么判断response连接断开 需要在连接断开时停止后台操作,所以需要获取response连接状态


用 js 遍历数组,然后调用 python 脚本处理数组元素,但得到的结果却是乱序的

$
0
0

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循环遍历

$
0
0

遇到了在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客户端

$
0
0

经过半个月的开发终于把CNode客户端基本开发完毕了,性能优化也基本上做完了!APP 跑起来没啥大问题了。目前支持一下功能

  1. 手动输入token 登录
  2. 二维码登录
  3. 更换皮肤
  4. 主题列表
  5. 主题详情
  6. 主题评论
  7. 主题刷新、分享、在浏览器中打开
  8. 评论列表展示
  9. 评论刷新、评论回复
  10. 个人资料查看
  11. 退出登录功能
  12. 消息列表
  13. 小尾巴
  14. 图片预览、下载

项目截图

Android

ask.jpgdetail.jpgdetail2.jpgjob.jpgjob.jpgmine.jpgshare.jpgtheme.jpguser.jpg

IOS

detail.pngdetail2.pngjob.pngmine.pngshare.pnguser.pngtheme.png

如果你觉得本项目对你有帮助,请帮作者star。作者是前端小白一名。如果有写错的地方请指正,谢谢! 传送门

mysql的基本操作

$
0
0

“”" 字段类型: 数字: 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,快来吧!!!

$
0
0

深圳市一花科技有限公司 招聘 【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层 一花科技.jpg三亚之旅.jpg一起生日轰趴.jpg携手驰骋大海_meitu_3.jpg201701 旅游年会合影.jpg

Viewing all 14821 articles
Browse latest View live