在express中使用cojs是否正确?
我在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函数的调用栈