Open 91wangmeng opened 8 years ago
+1
+1
+1
我也上遇到同样的问题。排查后,发现我的系统ATOM调用sync-request模块会发生此类错误。
为了能继续使用qiniu-uploader,可以采用以下两种方法解决这个问题,修改后亲测可用。
具体代码可以参考:
我的git: https://github.com/jingchen2222/nodejs-sdk.v6/tree/my-new-feature 如果操作不成功,或有其他问题可以在我的git上留言。
修改zone.js,关闭zone.js中的http同步请求,使用AUTOZONE的配置=true:
File Path:~/.atom/packages/qiniu-uploader/node_modules/qiniu/qiniu/zone.js
exports.up_host = function (uptoken, conf){
var version = process.versions;
var num = version.node.split(".")[0];
// node 版本号低于 1.0.0, 使用默认域名上传,可以在conf中指定上传域名
if(num < 1 ){
conf.AUTOZONE = false;
}
if(!conf.AUTOZONE){
return;
}
….
}
exports.up_host = function (uptoken, conf){
var version = process.versions;
var num = version.node.split(".")[0];
// node 版本号低于 1.0.0, 使用默认域名上传,可以在conf中指定上传域名
conf.AUTOZONE = true;
if(!conf.AUTOZONE){
return;
}
….
}
修改后,无论node版本如何,都使用AUTOZONE,实际上,会自动从qiniu-uploader的配置中获取域名。
step 1: zone.js中添加函数:
…
// 添加代码如下:
var urllib = require('urllib');
var util = require('./util');
exports.up_host_async = function (uptoken, conf, callback){
var version = process.versions;
var num = version.node.split(".")[0];
// node 版本号低于 1.0.0, 使用默认域名上传,可以在conf中指定上传域名
if(num < 1 ){
conf.AUTOZONE = false;
}
if(!conf.AUTOZONE){
callback();
return;
}
var ak = uptoken.toString().split(":")[0];
var tokenPolicy = uptoken.toString().split(":")[2];
var tokenPolicyStr = new Buffer(tokenPolicy, 'base64').toString();
var json_tokenPolicyStr = JSON.parse(tokenPolicyStr);
var scope = json_tokenPolicyStr.scope;
var bucket = scope.toString().split(":")[0];
// bucket 相同,上传域名仍在过期时间内
if((new Date().getTime() < conf.EXPIRE) && bucket == conf.BUCKET){
callback();
return;
}
//记录bucket名
conf.BUCKET = bucket;
var request_url = 'http://uc.qbox.me/v1/query?ak='+ ak + '&bucket=' + bucket;
var data = {
contentType: 'application/json',
method: 'GET',
};
var req = urllib.request(request_url, data, function(err, result, res) {
// console.log(result);
if(res.statusCode == 200){
// console.log(result);
var json_str = JSON.parse(result.toString());
// console.log(json_str);
//判断设置使用的协议, 默认使用http
if(conf.SCHEME == 'http'){
conf.UP_HOST = json_str.http.up[1];
}else{
conf.UP_HOST = json_str.https.up[0];
}
conf.EXPIRE = 86400 + new Date().getTime();
callback();
return;
}else{
var err = new Error('Server responded with status code ' + res.statusCode + ':\n' + res.body.toString());
err.statusCode = res.statusCode;
err.headers = res.headers;
err.body = res.body;
throw err;
callback();
}
});
return;
}
step 2: 修改io.js文件
File Path:~/.atom/packages/qiniu-uploader/node_modules/qiniu/qiniu/io.js 修改函数:putReadable
修改后:
// onret: callback function instead of ret
function putReadable (uptoken, key, rs, extra, onret) {
if (!extra) {
extra = new PutExtra();
}
if (!extra.mimeType) {
extra.mimeType = 'application/octet-stream';
}
if (!key) {
key = exports.UNDEFINED_KEY;
}
rs.on("error", function (err) {
onret({code: -1, error: err.toString()}, {});
});
// 设置上传域名
zone.up_host_async(uptoken, conf, function() {
var form = getMultipart(uptoken, key, rs, extra);
return rpc.postMultipart(conf.UP_HOST, form, onret);
});
}
+1 看不懂怎么改,貌似要改源码的样子. 什么时候qiuniu-uploader会更新么
按照你说的改了,还是有问题
确实不行,我跟楼上一样,按方法一操作的
同样遇到了这个问题
@jingchen2222 谢谢分享,我的按照到第一种方法成功了
@jingchen2222 好吧,没有成功,是我看错了,只是安装成功了,但是还是报错
@DRPrincess @Mrfuture1 @idelin @91wangmeng
我参照这个插件写了个阿里云OSS的uploader,see https://github.com/airclear/oss-uploader
@Mrfuture1 @idelin @91wangmeng
把@jingchen2222 给的链接中的三个文件 io.js文件、rpc.js、zone.js 复制下来替换我们本地下载下的qiniu_uploader 中的对应文件,就能解决问题。
但是要注意 要复制 my_new_feature分支中的文件,那个才是最新的,修改过这个问题的。
+1
亲测,@DRPrincess 的方法可行
[Enter steps to reproduce below:]
Atom Version: 1.12.4 Electron Version: 1.3.9 System: Mac OS X 10.10.5 Thrown From: qiniu-uploader package, v0.0.3
Stack Trace
Uncaught EvalError: Refused to evaluate a string as JavaScript because 'unsafe-eval' is not an allowed source of script in the following Content Security Policy directive: "script-src 'self'".
Commands
Config
Installed Packages