Fork me on GitHub
一共有 61 篇文章,分页:7 / 13

让nodejs方法同时支持async/await和回调模式调用

使用async/await可以让你用同步的方式写代码,忘掉callback,简直不能更爽,但是原来的老接口不支持async/await调用怎么办呢?

我琢磨出下面一个方法,根据最后一个参数是否是function类型的参数,来判断是哪种调用,而且做到可以无痛改造原有方法。

function promisify (func, this_obj) {//(from http://yoyo.play175.com)
    return function() {
        if (arguments.length > 0 && arguments[arguments.length - 1].constructor == Function) {
            //回调模式
            func.apply(this_obj, arguments);
        } else {
            //否则是Promise或者async/await模式
            let args = arguments;
            return new Promise((resolve, reject) => {
                Array.prototype.push.call(args, function(err, ret) {
                    if (err) {
                        //有错误产生
                        reject.call(this_obj, err);
                    } else {
                        //没有错误产生,去掉第一个err参数
                        let other_parameters = Array.prototype.slice.call(arguments, 1);
                        resolve.apply(this_obj, other_parameters);
                    }
                });
                func.apply(this_obj, args);
            });
        }
    };
}

当然这里有一个前提要求是回调方法的第一个参数必须是接受错误信息的参数,然后回调函数是这个方法最后一个参数。

例如有一个接口getuser,原来是这样的:

api.getuser = function(id,callback){
    callback(users[id]);
};

回调模式调用会是这样:

api.getuser(123,function(err,user){
    //得到user
});

现在我们给他改造一下,让它同时支持async/await调用,很简单,只是把function用promisify包装一下 :

api.getuser = promisify(function(id,callback){
    callback(users[id]);
});

现在它可以被回调模式调用,也同时支持async/await调用:

var user = await api.getuser(123);

Centos7.x 安装php-fpm5.6 + nginx

#安装php-fpm 5.6(包括mysql、redis、opcache等常用扩展)
rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm
yum install php56w-fpm php56w-devel php56w-mysqlnd php56w-pecl-redis php56w-gd php56w-opcache php56w-mbstring php56w-common php56w-mcrypt -y
#安装nginx
yum install nginx -y

运行php-fpm service php-fpm restart

运行nginx service nginx restart

安装rinetd

wget https://boutell.com/rinetd/http/rinetd.tar.gz
tar -xf rinetd.tar.gz
cd rinetd
make

#看看安装到哪了?
which rinetd

默认读取配置文件路径是:/etc/rinetd.conf,规则:

#本机监听IP  监听端口   目标IP           目标端口

0.0.0.0      4044        124.23.32.3    3306

启动直接运行命令rinetd即可,也可以编写一个启动脚本,请参考:

#!/bin/bash
#先停掉之前的进程
ps -efww|grep -w 'rinetd'|grep -v grep|cut -c 9-15|xargs kill -9
#启动新的
rinetd

安装stunnel

服务端安装(centos)

wget https://www.stunnel.org/downloads/stunnel-5.43.tar.gz
tar -xf stunnel-5.43.tar.gz
cd stunnel-5.43
yum install gcc openssl-devel -y
./configure
make
make install

#按要求输入一下信息或者一路回车,生成ssl证书
make cert

服务端配置文件路径:/usr/local/etc/stunnel/stunnel.conf,该目录下面有一个示例文件:stunnel.conf-sample可以参考,下面是我给svn和mysql数据库传输加密的配置,仅供参考

compression=zlib  
syslog=yes  
debug=7  
output=/var/log/stunnel.log  
setuid=root  
setgid=root  
pid=/var/run/stunnel.pid  
cert=/usr/local/etc/stunnel/stunnel.pem  
key=/usr/local/etc/stunnel/stunnel.pem  
client=no  

[svn]
accept=3691
connect=127.0.0.1:3690 

[mysql]
accept=3307
connect=127.0.0.1:3306

服务端启动直接运行命令stunnel即可,也可以编写一个启动脚本,请参考:

#!/bin/bash
#先停掉之前的进程
ps -efww|grep -w 'stunnel'|grep -v grep|cut -c 9-15|xargs kill -9
#启动新的
stunnel

或者执行以下脚本创建这个启动脚本:

cat > /root/run_stunnel << EOF
#!/bin/bash
#先停掉之前的进程
ps -efww|grep -w 'stunnel'|grep -v grep|cut -c 9-15|xargs kill -9
#启动新的
stunnel
EOF

chmod +x /root/run_stunnel
阅读全文 »»

openwrt开启sftp

root@OpenWrt:~# opkg update
root@OpenWrt:~# opkg install vsftpd openssh-sftp-server
root@OpenWrt:~# /etc/init.d/vsftpd enable
root@OpenWrt:~# /etc/init.d/vsftpd start

引用来源:http://blog.sina.com.cn/s/blog_790f47850101m62g.html