使用nodejs的命令进程child_process
需要注意的是,exec 会首先创建一个新的 shell 进程出来,然后执行 command。execFile 则是直接将可执行的 file 创建为新进程执行。所以,execfile 会比 exec 高效一些。exec 比较适合用来执行 shell 命令,然后获取输出(比如:exec(‘ps aux | grep “node”’)),但是 execFile 却没办法这么用,因为它实际上只接受一个可执行的命令,然后执行(没法使用 shell 里面的管道之类的东西)。
exec方式会创建一个新的进程,而execFile默认只是直接执行命令。
文件存储
picgo传递的是一个buffer,需要重新转成文件后才能上传。
const handle = async (ctx: IPicGo): Promise<IPicGo> => {
const smmsConfig = ctx.getConfig<ISmmsConfig>('picBed.smms')
const imgList = ctx.output
for (const img of imgList) {
if (img.fileName && img.buffer) {
let image = img.buffer
if (!image && img.base64Image) {
image = Buffer.from(img.base64Image, 'base64')
}
const postConfig = postOptions(img.fileName, image, smmsConfig?.token)
let body = await ctx.Request.request(postConfig)
// 读取图片数据
var img = imgObject.buffer
if((!img) && (imgObject.base64Image)){
img = Buffer.from(imgObject.base64Image, 'base64')
}
// 备份图片
fs.writeFile(`${imagePath}/${imgObject.fileName}`, img, function(err){
if(err){
ctx.log.error(`[Autobackup]${err}`)
}
})
Promise 状态
用于表示 promise 的状态
到执行到 resolve()这个方法的时候,就改变promise的状态为
fullfiled ,当状态为 fuulfiled的时候就可以执行.then()
当执行到 reject() 这个方法的时候,就改变 promise 的状态为
reject,当 promise 为reject 就可以.catch() 这个promise了
然后这两个方法可以带上参数,用于.then() 或者 .catch() 中使用。
所以这两个方法不是替代,或者是执行什么,他们的作用就是 用于改变
promise 的状态。
然后,因为状态改变了,所以才可以执行相应的 .then() 和 .catch()操作。
||
通过回调里的resolve(data)将这个promise标记为resolverd,然后进行下一步then((data)=>{//do something}),resolve里的参数就是你要传入then的数据
作者:北原夏K 链接:https://www.jianshu.com/p/5b0b89bf4664 来源:简书 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
定义Promise的返回类型
https://www.jianshu.com/p/4f78b2a294cc
使用Promise(){}
mapResult 可以是Interface
需要将域名后面的/去掉
https://link.storj.io/s//2022/04/0df4e548da272c565e759cc1c3e56094.png
会出现重复
后续改进
将backup 进程放在after uploads??这会默认注册全部的内容
将上传部分改成异步方式。
调整同步为异步
function execPromise(command) {
return new Promise(function(resolve, reject) {
exec(command, (error, stdout, stderr) => {
if (error) {
reject(error);
return;
}
resolve(stdout.trim());
});
});
}
Use the function:
execPromise(command).then(function(result) {
console.log(result);
}).catch(function(e) {
console.error(e.message);
});
Or with async/await:
try {
var result = await execPromise(command);
} catch (e) {
console.error(e.message);
}
- async/await 可以算是异步编程的终极解决方案,它通过同步的方式写异步代码,可以把 await 看作是让出线程的标志,先去执行 async 函数外部的代码,等调用栈为空再回来调用 await 后面的代码。
不能promise后的then里面再放一层promise,await 就是解决这类问题的,所以将promise分开,并且加上await就可以了。
可以将handle写短,减轻复杂度
这里的上传速度比较慢不知道是不是使用了await的缘故,
然后桶的创建需要自己配置,多个后端源的话需要自己设置 桶内容。
rclone mkdir storj:pic-mxuan
b2的跨域请求
好像使用s3兼容的就没问题???
等下再试下。
新的CDN和存储
发现新的cdn和存储,1G存储和1G流量各记为1积分,共25积分,还有请求次数。算起来也可以,重点是Akamai的和Fastly的网络,这个网络质量是真的很棒了。
https://cloudinary.com/documentation/node_image_manipulation#deliver_and_transform_images
可以多账号注册来解决免费的问题。
可以自己写rclone 存储插件解决备份问题,或者本地备份。