已经安装好了keystonejs并进行了一些定制,后发现使用的twig引擎不再被维护了,想切换到nunjucks,请问如何无痛切换? 最好是简单一点的方法啊,各位大佬
keystonejs如何在安装后更换视图引擎?
阿里淘宝技术部(手淘) 内推招人
阿里淘宝技术部(手淘) 内推招人, 主要面向社招,优秀应届毕业也考虑。 (地点杭州)
- 参与过大型的开源项目
- 有自己的技术博客。
- 熟悉目前主流的前端技术框架有过一到两个比较深入的研究 egg.js react rax weex webpack grapql redux …
- 有在其他技术领域或者兴趣方面的特长。(更好)
感兴趣可以发我邮箱break_happy@163.com
q模块如何指定重试次数返回promise
例如
const Q = require('q');
function test(name,resetcount) {
console.log(`${resetcount}\t${name}`);
let _deferred = Q.defer();
if (name.length >= 5) {
_deferred.resolve('ok,the name is:' + name);
} else {
_deferred.reject('fail');
}
return _deferred.promise;
}
如果要重试3次就返回结果,该如何写
如何给一个Node开发的管理系统加入一个系统密钥
具体的需求就是同一台电脑或者同一台服务器在第一次运行这个系统的时候,会在页面上面输出一段类似md5密钥的字符串,通过这一段字符串进行某种算法,或者叫做解密,生成一段新的字符串,在后台代码文件中写入这个新的字符串,然后这个系统才能正常的运行,以后这太机器想要运行这套系统就一直使用这个密钥。
egg form-data提交如果没有文件报错 cant found upload file
问题:
1.如果使用mutipart/formdata提交表单,表单如果没有文件的话,egg中ctx.getFileStream()
会报错cant found upload file
,那这样就无法获得stream对象,就无法获取其它的字段。怎么解决?(那个因为前端那边的需求是传文件和字段,文件是可以不提交的)
2.前端使用的是Angular4写的,用的FormData对象提交文件和字段,为什么egg中ctx.getFileStream()
获得的stream中fields字段是空的。
请求的截图问题2中前端的代码
sendplayRequest() {
let formData: FormData = new FormData();
if(this.playRequest.file){
formData.append("file",this.playRequest.file)
}
formData.set("MsgTitle",this.playRequest.MsgTitle)
this.apiService.PlayRequest(formData).subscribe(res => {
console.log(res);
})
}
PlayRequest(formData: FormData){
return this.http
.post(this.host + "/play",formData)
.map(res => res.json());
}
发出的请求头
服务端代码:
const config = ctx.app.config;
//获取上传的表单文件流以及表单字段
let stream;
try{
stream = await ctx.getFileStream();
}catch(e) {
console.log(e);
return await next()
}
console.log(stream.fields;)
综上,希望有大神可以帮我解惑
【新手提问】 node异步和js异步
我不是很理解异步,说到异步,大家都会说Ajax 这个我明白,浏览器有专门的通讯进程可以做执行者,有别人说可以通过定时器来做到异步,这我就很不明白了,假设js主进程内是无执行内容的,定时器效果触发进入消息队列然后进入主进程序列执行,从本质上来说,执行方还是js主进程,既然是主程序执行,难道所谓的异步是指延迟执行?既然是异步,那执行者又是什么,换到node中,node的定时器还能用来做异步么,或者说还有其他异步的方法。求大神指点迷津!
基于 react 后端模板引擎 noox 发布了
React 组件化思想受到越来越多开发者的关注,组件化思想帮助开发者将页面解耦成一个一个组件,代码更加模块化, 更易扩展。而目前流行的后端模板引擎如 ejs, swig, jade, art 共同的问题是:
- 需要学习各类模板引擎定义的语法,如 {{if}}, {{loop}}
- 对组件化支持不够强,实现复杂,不易用
针对以上痛点,笔者基于 React 造出了 noox 这样一个工具,专注于后端模板的解析,让模板解析更加简单,易用。
使用方法
安装
npm install noox
简单的 demo
模板代码
首先创建组件目录和增加模板文件
mkdir components && cd components
vi Head.jsx
Head.jsx 内容如下:
<head>
<title>{title}</title>
<meta name="description" content={props.description} />
<link rel="stylesheet" href="./css/style.css" />
</head>
Node.js Code
const noox = require('noox');
const nx = new noox(path.resolve(__dirname, './components'), {title: 'noox'});
let output = nx.render('Head', {description: 'hello, noox.'})
输出
<head>
<title>noox</title>
<meta name="description" content="hello, noox." />
<link rel="stylesheet" href="./css/style.css" />
</head>
原理
Noox 在 React 的 Jsx 的基础上,简化了组件引用和创建,假设创建一个目录结构如下:
components/
Header.jsx
Body.jsx
Layout.jsx
运行如下 nodejs 的代码:
nx = new noox(path.resolve(__dirname, './components'))
将会创建三个组件:
- Header
- Body
- Layout
然后通过 nx.render 渲染
nx.render('Body', props)
后记
感兴趣的可以 star 关注下,共同探讨
Github: noox
nodejs实现查询火车票信息
项目地址:https://github.com/silenceboychen/search-train-ticket
输入始发站,到达站,出发时间,可以打印出当天所有车次信息.
自己搭建以太坊节点[区块链]
geth是什么
- go-ethereum就是通常所说的 geth ,它是一个用Go语言实现运行在以太坊完整节点上的命令行接口,安装并运行了geth,你可以成为以太坊正式链的节点并且可以:
- 挖矿得到真实的以太币
- 在账户地址之间转移资金
- 创建智能合约和发起交易
- 查看所有历史区块
- 还有很多很多功能
客户端种类
客户端 语言 开发者 最新版本 go-ethereum Go 以太坊基金会 go-ethereum-v1.4.9 Parity Rust Ethcore Parity-v1.2.1 cpp-ethereum C++ 以太坊基金会 cpp-ethereum-v1.2.9 pyethapp Python 以太坊基金会 pyethapp-v1.2.3 ethereumjs-lib Javascript 以太坊基金会 ethereumjs-lib-v3.0.0 Ethereum(J) Java <ether.camp> ethereumJ-v1.3.0-RC3-daoRescue2 ruby-ethereum Ruby Jan Xie ruby-ethereum-v0.9.3 ethereumH Haskell BlockApps 尚无Homestead 版本
使用go-ethereum
1. git clone https://github.com/ethereum/go-ethereum
2. cd go-ethereum
3. make geth
4. build/bin/geth
- 注意需要安装好go
启动节点
下面的命令行是加入以太坊ropsten测试网络,并且对外开放公网IP
nohup go-ethereum/build/bin/geth --testnet --rpc --rpcaddr 0.0.0.0 --rpcapi eth,net,web3 --syncmode fast --cache 1028 --datadir /data/block/ > /data/block/geth.log 2>&1 &
- testnet (Ropsten network: pre-configured proof-of-work test network)
- rpc (Enable the HTTP-RPC server)
- rpcaddr (HTTP-RPC server listening interface (default: “localhost”))
- rpcapi (API’s offered over the HTTP-RPC interface)
- rpcport (HTTP-RPC server listening port (default: 8545))
- port (Network listening port (default: 30303))
- datadir (Data directory for the databases and keystore)
- syncmode (Blockchain sync mode (“fast”, “full”, or “light”))
- cache value (Megabytes of memory allocated to internal caching (min 16MB / database forced) (default: 128)) 优化性能
web3.js简单介绍[区块链]
##介绍
node web3模块: This is the Ethereum compatible JavaScript API which implements the Generic JSON RPC spec
通过web3能够方便的与以太坊交互,开发者不用关心JSON RPC实现细节。
geth提供了以下的api模块: “admin”:“1.0”, “db”:“1.0”, “debug”:“1.0”, “eth”:“1.0”, “miner”:“1.0”, “net”:“1.0”, “personal”:“1.0”, “shh”:“1.0”, “txpool”:“1.0”, “web3”:“1.0”
By default Geth enables all APIs over the IPC (ipc) interface and only the db, eth, net and web3 APIs over the HTTP and WebSocket interfaces.
###使用
注意事项
- 默认用同步的方式,同时也支持异步。 As this API is designed to work with a local RPC node, all its functions use synchronous HTTP requests by default. If you want to make an asynchronous request, you can pass an optional callback as the last parameter to most functions.
- bignumber 依赖bignumber这个模块 You will always get a BigNumber object for number values as JavaScript is not able to handle big numbers correctly.
设置provider(以太坊节点提供的HTTP-RPC服务)
``` var Web3 = require('web3'); var web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545")) web3.eth.getTransaction('0x9fc76417374aa880d4449a1f7f31ec597f00b1f6f3dd2d66f4c9c6c445836d8b');
//eg: 获取一笔交易的信息:
{ “hash”: “0x9fc76417374aa880d4449a1f7f31ec597f00b1f6f3dd2d66f4c9c6c445836d8b”, “nonce”: 2, “blockHash”: “0xef95f2f1ed3ca60b048b4bf67cde2195961e0bba6f70bcbea9a2c4e133e34b46”, “blockNumber”: 3, “transactionIndex”: 0, “from”: “0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b”, “to”: “0x6295ee1b4f6dd65047762f924ecd367c17eabf8f”, “value”: BigNumber, “gas”: 314159, “gasPrice”: BigNumber, “input”: “0x57cb2fc4” }
#参考文档 1. https://github.com/ethereum/go-ethereum/wiki/Management-APIs 2. https://github.com/ethereum/wiki/wiki/JSON-RPC 3. https://github.com/ethereum/wiki/wiki/JavaScript-API
汉化了一下regexper的正则图标解析 有需要的收藏一下啊
mongodb更新内嵌数组的问题,只能用循环来处理吗
数据结构如上,更新的条件是yoocare_id,yoocare_info是一个数组,符合条件的yoocare_id可能有多个,需要把符合条件的residue_degree更新掉,现在我用的方法比较笨,先找到yoocare_info这个数组,然后用map循环,符合yoocare_id的,处理下residue_degree,最后拿到一个全新的yoocare_info数组,最后把数组更新掉,这种方法数量小的话,还能用数据量大的话,速度岂不是要爆炸。。。。
求老哥们指点
express如何实现表单中的method转换,比如:POST转成PUT
看某本书,下面这种写法已经无效:
分享申请免费的ssl证书,并可以定期 新证书
acme.sh能申请免费的ssl证书,并可以定期 新证书,非常省 。
1. 安装 acme.sh
安装很简单, 一个命令:
curl https://get.acme.sh | sh
普通用户和 root 用户都可以安装使用.建议root下执行 安装过程进行了以下几步:
- 把 acme.sh安装到你的 home目录下:
~/.acme.sh/
并创建 一个 bash 的 alias, 方便你的使用: acme.sh=~/.acme.sh/acme.sh
以下是在nginx上的使 步骤──
如果系统的80和443已经被其他虚拟主机运营占 ,则先做 个最普通的80端 的nginx 件
server {
listen 80;
server_name example.com;
location / {
root html;
index index.html index.htm;
}
location = /favicon.ico {
log_not_found off;
access_log off;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
检查配置 件语法错误
nginx -t
重启nginx让虚拟主机 效
systemctl restart nginx
动申请证书,acme.sh会检查nginx对此域名的http header是不是200,通过后把证书复制到 临时 录。
acme.sh --issue --nginx -d example.com --debug
将证书从临时 录部署到nginx/ssl下,但不会修改现有的conf 件
acme.sh --install-cert -d example.com \
--key-file /etc/nginx/ssl/example.com/key.pem \
--fullchain-file /etc/nginx/ssl/example.com/cert.pem \
--reloadcmd "service nginx force-reload"
复制 个现成的带ssl配置的conf替换掉80端 的配置 件
server {
listen 80;
server_name www.ssstk.tk ssstk.tk;
rewrite ^ https://$server_name$request_uri? permanent;
}
server {
listen 443 ssl http2;
server_name www.ssstk.tk ssstk.tk;
ssl on;
ssl_certificate /etc/nginx/ssl/ssstk.tk/cert.pem;
ssl_certificate_key /etc/nginx/ssl/ssstk.tk/key.pem;
charset utf-8;
access_log /opt/logs/nginx/ssstk.access.log;
error_log /opt/logs/nginx/ssstk.error.log;
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $http_host;
proxy_pass http://127.0.0.1:8000;
}
}
分享下使用acme.sh搭建的站点
ssstk过云梯享受科学上网
自己使用GCP搭建的过云梯
注册领取免费时长
速度很快的哦
selenium webdriver相关
driver.actions().dragAndDrop(element, {x: 100, y: 0}).perform()
请问,上述代码由于执行过快,不符合真实用户的行为。 如何模拟真实行为,例如:分批次拖拽,并且拖拽过程中可停留。
伪代码: driver.actions().dragAndDrop(element, {x: 100, y: 0}).dragAndDrop(element, {x: 100, y: 0}).perform() 上述代码可实现拖动两次的效果,但无法实现停留。
目标伪代码: driver.actions().dragAndDrop(element, {x: 100, y: 0}).sleep(1* 1000).dragAndDrop(element, {x: 100, y: 0}).perform() 上述代码:拖动一次,停留1秒,再拖动一次。 类似上述的目标代码尝试过很多方案,官方文档也找了好久,依然无解~ 求大神指点迷津。。。不胜感激(╯‵□′)╯︵┻━┻
egg.js 中使用egg-redis如何存储其他类型的数据
egg.js中使用egg-redis如何存储其他类型的数据(默认存储的是string),急急急。求大神指教!!
mongoose中Entity的save操作返回的不是promise吗?
环境: node v8.7.0 mongoose v4.13.9
const mongoose = require('mongoose')
mongoose.Promise = global.Promise
const db = mongoose.createConnection('localhost', 'test')
let userSchema = new mongoose.Schema({
name:String
})
let userModel = db.model('User', userSchema)
let userEntity = new userModel({
name:'a'
})
let save = async function(){
await userEntity.save(()=>{
console.log(1)
})
console.log(2)
}
save()
如果userEntity.save返回值是promise这里应该是先1后2,可是结果是先2后1,这是为什么?
关于http请求:request与superagent,用request能请求到数据,用superagent不能请求到,求大神指点迷津,谢谢
const url='http://h5vv.video.qq.com/getinfo?callback=txplayerJsonpCallBack_getinfo_591513&isHLS=false&charge=0&vid=y00221a60w7&defn=hd&defnpayver=1&otype=json&guid=29a06bf3852fbe2ea6eb53829c3878fa&platform=10901&sdtfrom=v1010&host=v.qq.com&_rnd=1479010822&fhdswitch=0&show1080p=1&_qv_rmt=sNk0sWZTA17002uQa%3D&_qv_rmt2=0Qs65I9%2B149182HOQ%3D&_=1479010820769'
// request.get(url,(err,sres,body)=>{
// res.send({'ss':body})
// })
superagent.get(url).end((err,sres)=>{
res.send({'qq':err,'ww':sres})
})
求指点,谢谢
js == 与 === 性能问题
从入门就有人教我,===的性能比==好很多 于是做了一个小测试
console.log(new Date())
for (let i = 0; i < 10000000; i++) {
i === i
}
console.log(new Date())
console.log('==============================')
console.log(new Date())
for (let j = 0; j < 10000000; j++) {
j == j
}
console.log(new Date())
两者输出时间差几乎是一样的,于是进行改进,加大了循环次数, 输出结果却是==的消耗时间明显小于===的消耗时间, 有没有大佬能指正一下我在哪一步出了问题