在express中使用cojs是否正确?
发布于 8 年前 作者 lyt308012546 3123 次浏览 来自 问答

我在express中使用了co js,但依然觉得很麻烦,想问下大家是不是都是这样写的。

// verify中间件文件
const wechat = require('../util/wechat');
const co = require('co');

let verify = {
    wechat(){
        return (req, res, next) => {
            if (req.method.toUpperCase() === 'POST') {
                if (req.query && req.query.appid) {
                    co(function *() {
                        let isVerif = yield  wechat.checkWechat(req);
                        if (isVerif) {
                            next();
                        }
                        else {
                            res.end('verify failed');
                        }
                    }).catch(error=> {
                        console.log(error.message)
                        res.end('verify of exception');
                    });
                }
                else {
                    res.end('url parameters is error');
                }
            }
            else {
                next();
            }
        }
    }
};

module.exports = verify;
// wechat 工具类文件
const co = require('co');
const crypto = require('crypto');
const setting = require('../db').sequelize('sys_settings');


let wechat = {
    sysSettings: null,
    getSettings(){
        let self = this;
        return co(function *() {
            let result = yield setting.findAll({
                where: {
                    type: "SYSOA"
                }
            });

            let option = {};
            result.forEach(function (value) {
                option[value.key.toUpperCase()] = value.value;
            });
            self.sysSettings = option;
        });
    },
    checkWechat (req){
        let query = req.query;
        return this.checkSign(query.signature, query.timestamp, query.nonce);
    },
    checkSign (signature, timestamp, nonce, encryptStr){
        let self = this;
        return co(function*() {
            if (!self.sysSettings) {
                yield self.getSettings();
            }

            let token = self.sysSettings.TOKEN;

            if (!signature || !token) {
                return false;
            }

            timestamp = timestamp ? timestamp : "";
            nonce = nonce ? nonce : "";
            if (typeof encryptStr === 'object') {
                encryptStr = encryptStr[0] ? encryptStr[0] : "";
            }
            encryptStr = encryptStr ? encryptStr : "";

            let signArr = [timestamp, nonce, token, encryptStr];
            let signArrStr = signArr.sort().join('');
            let sha1 = crypto.createHash('sha1');
            let tmpsign = sha1.update(signArrStr).digest('hex');
            return tmpsign === signature;
        });
    }
};
module.exports = wechat;

我在中间件verify中调用了wechat的checkWechat方法,我希望在每个地方都使用yield来让代码更直观, 那我是不是需要在每个地方都要用上

co(function (){
	.....
}) 

这样的代码?感觉特别不爽,有没有更好的办法?有没有相关demo或实例? 用了koa2js,感受es7的async/await 的方便,觉得co 真的没那么爽,不过async/await不能断点调试,不知道各位有没有啥解决方案。

1 回复

async/await 可以断点的吧,反正VSCode里面是可以的。最近更新的 1.11 版里面还能查看async函数的调用栈

回到顶部