node.js 如何正确的使用 七牛云官方SDK

本文详细记录了在Node.js环境中如何正确使用七牛云官方SDK的过程,包括安装SDK、解决初始错误、PutExtra函数不存在的问题以及如何找到并使用example中的正确代码示例,最终提供了一份整理后的官方案例代码。

开发板推荐:天空星STM32F407VET6开发板

超高性价比 STM32主控 | 超高主频 | 一板兼容百芯 | 比赛神器 | 沉金彩色丝印

官方 SDK 链接

个人博客地址

开始

安装一下七牛云的 SDK

npm install qiniu

然后 copy 一下官方案例代码

var qiniu = require("qiniu");

//需要填写你的 Access Key 和 Secret Key
qiniu.conf.ACCESS_KEY = 'Access_Key';
qiniu.conf.SECRET_KEY = 'Secret_Key';

//要上传的空间
bucket = 'Bucket_Name';

//上传到七牛后保存的文件名
key = 'my-nodejs-logo.png';

//构建上传策略函数
function uptoken(bucket, key) {
  var putPolicy = new qiniu.rs.PutPolicy(bucket+":"+key);
  return putPolicy.token();
}

//生成上传 Token
token = uptoken(bucket, key);

//要上传文件的本地路径
filePath = './ruby-logo.png'

//构造上传函数
function uploadFile(uptoken, key, localFile) {
  var extra = new qiniu.io.PutExtra();
    qiniu.io.putFile(uptoken, key, localFile, extra, function(err, ret) {
      if(!err) {
        // 上传成功, 处理返回值
        console.log(ret.hash, ret.key, ret.persistentId);       
      } else {
        // 上传失败, 处理返回代码
        console.log(err);
      }
  });
}

//调用uploadFile上传
uploadFile(token, key, filePath);

首先,你会遇到第一个错误

Error: invalid putpolicy options

看下源码是这样的

// 上传策略
// @link https://developer.qiniu.com/kodo/manual/1206/put-policy
function PutPolicy(options) {
    if (typeof options !== 'object') {
        throw new Error('invalid putpolicy options');
    }

    this.scope = options.scope || null;
    this.isPrefixalScope = options.isPrefixalScope || null;
    this.expires = options.expires || 3600;
    this.insertOnly = options.insertOnly || null;

    this.saveKey = options.saveKey || null;
    this.endUser = options.endUser || null;

    this.returnUrl = options.returnUrl || null;
    this.returnBody = options.returnBody || null;

    this.callbackUrl = options.callbackUrl || null;
    this.callbackHost = options.callbackHost || null;
    this.callbackBody = options.callbackBody || null;
    this.callbackBodyType = options.callbackBodyType || null;
    this.callbackFetchKey = options.callbackFetchKey || null;

    this.persistentOps = options.persistentOps || null;
    this.persistentNotifyUrl = options.persistentNotifyUrl || null;
    this.persistentPipeline = options.persistentPipeline || null;

    this.fsizeLimit = options.fsizeLimit || null;
    this.fsizeMin = options.fsizeMin || null;
    this.mimeLimit = options.mimeLimit || null;

    this.detectMime = options.detectMime || null;
    this.deleteAfterDays = options.deleteAfterDays || null;
    this.fileType = options.fileType || null;
}

哦,原来要传入的是一个对象

//构建上传策略函数
function uptoken(bucket, key) {
  var putPolicy = new qiniu.rs.PutPolicy(bucket+":"+key);
  return putPolicy.token();
}

将以上代码修改为:

//构建上传策略函数
function uptoken(bucket, key) {
  var putPolicy = new qiniu.rs.PutPolicy({scope:bucket+":"+key});
  return putPolicy.token();
}

是不是感觉 ok了,可以用了,其实还是错了

var extra = new qiniu.io.PutExtra();

这句代码会告诉你 PutExtra 函数不存在 ,哇偶 ,我去看了一下源码

var libPath = process.env.QINIU_COV ? './lib-cov' : './qiniu';

module.exports = {
    auth: {
        digest: require(libPath + '/auth' + '/digest.js')
    },
    cdn: require(libPath + '/cdn.js'),
    form_up: require(libPath + '/storage/form.js'),
    resume_up: require(libPath + '/storage/resume.js'),
    rs: require(libPath + '/storage/rs.js'),
    fop: require(libPath + '/fop.js'),
    conf: require(libPath + '/conf.js'),
    rpc: require(libPath + '/rpc.js'),
    util: require(libPath + '/util.js'),
    zone: require(libPath + '/zone.js'),
    app: require(libPath + '/rtc/app.js'),
    room: require(libPath + '/rtc/room.js'),
    Credentials: require(libPath + '/rtc/credentials.js')
};

根本没有 io.js 嘛,这时候发现 node_modules 中有 example (感觉看到了希望!!!)

原来是这样写的:

var putExtra = new qiniu.form_up.PutExtra();

略略略,藏的这么深

这样也还没完,关于 qiniu.io 的部分都要改,整理一下是这样的:

var config = new qiniu.conf.Config();

var formUploader = new qiniu.form_up.FormUploader(config);

//file
formUploader.putFile(uploadToken, null, localFile, putExtra, function(respErr,
  respBody, respInfo) {
  if (respErr) {
    throw respErr;
  }

  if (respInfo.statusCode == 200) {
    console.log(respBody);
  } else {
    console.log(respInfo.statusCode);
    console.log(respBody);
  }
});

好了,上面是爬坑过程,我整理了一下官方案例,代码如下:

const qiniu_sdk = require('qiniu')
const { qiniu } = require('../../../config/')

qiniu_sdk.conf.ACCESS_KEY = qiniu.ACCESS_KEY
qiniu_sdk.conf.SECRET_KEY = qiniu.SECRET_KEY

// 要上传的空间
const bucket = qiniu.bucket

// 文件前缀
const prefix = 'image/activity/'

// 生成上传文件的 token
const token = (bucket, key) => {
    
    const policy = new qiniu_sdk.rs.PutPolicy({ isPrefixalScope: 1, scope: bucket + ':' + key })


    return policy.uploadToken()
}

const config = new qiniu_sdk.conf.Config()

const upload_file = (file_name, file_path) => {
    // 保存到七牛的地址
    const file_save_path = prefix + file_name

    // 七牛上传的token
    const up_token = token(bucket, file_save_path)

    const extra = new qiniu_sdk.form_up.PutExtra()

    const formUploader = new qiniu_sdk.form_up.FormUploader(config)

    // 上传文件
    formUploader.putFile(up_token, file_save_path, file_path, extra, (err, ret) => {
        if (!err) {
            // 上传成功, 处理返回值
            console.log(ret);
        } else {
            // 上传失败, 处理返回代码
            console.error(err);
        }
    });
}

upload_file('test.png', './images/test.png')

开发板推荐:天空星STM32F407VET6开发板

超高性价比 STM32主控 | 超高主频 | 一板兼容百芯 | 比赛神器 | 沉金彩色丝印

评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Auspicious5

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值