收藏
回答

上传excel文件至数据库,邪乎了?

请教高手!本人欲上传EXCEL文件至数据库,在两个页面wxml中,用一个按钮实现上传。在两个页面中的button 事件都是一样的,代码也是复制粘贴的,肯定没错。而后,调用同一个云函数。但是出现了怪事,一个页面的button可以如实实现上传成功,但另外一个(后创建的)却一直不成功,控制台打印如下,以为是env环境变量没有设置好,后来增加了云函数中的env环境变量,还是一个页面的按钮可以实现上传一个不可以,不能上传的控制台打印如下结果,是否有高手能帮忙答疑解惑,可能哪里存在问题?

js. 代码:本次保证是复制贴在两个JS文件中代码一直,且DATA变量和其他配置也一样。

  uploadVBYFWGQ() {

    let that = this

    wx.chooseMessageFile({

      count: 1,

      type: 'file',

      success(res) {

        // tempFilePath可以作为img标签的src属性显示图片

        const tempFilePaths = res.tempFiles[0].path

        console.log("选择excel文件成功", res.tempFiles)


        wx.cloud.uploadFile({

          cloudPath: new Date().getTime() + ".xlsx",

          filePath: tempFilePaths, // 文件路径

          success: res => {

            // get resource ID

            console.log("上传后的res", res)

            console.log("上传成功", res.fileID)

            that.jiexi(res.fileID)

          },

          fail: err => {

            // handle error

            console.log("上传失败")

          }

        })

      }

    })

  },

  jiexi(fileId) {

    wx.cloud.callFunction({


      name: "exceluploadbywhs",

      data: {

        fileID: fileId,

        dbname: "VolumeBalance-YFWGQ"

      },

      success(res) {

        console.log("解析并上传成功", res)

        console.log("fileID", fileId)

      },

      fail(err) {

        console.log("解析失败", err)

      }

    })

  },

云函数段代码:两个事件都调用这个云函数。难道云函数被调用还存在先来后到的潜规则?

// 云函数入口文件

const cloud = require('wx-server-sdk')


cloud.init({

  env:"booking-87t85",

})

var xlsx = require('node-xlsx');

const db = cloud.database()


exports.main = async(event, context) => {

  let {

    fileID

  } = event

  //1,通过fileID下载云存储里的excel文件

  const res = await cloud.downloadFile({

    fileID: fileID,

  })

  const buffer = res.fileContent

  

  const tasks = [] //用来存储所有的添加数据操作

  //2,解析excel文件里的数据

  var sheets = xlsx.parse(buffer); //获取到所有sheets

  sheets.forEach(function(sheet) {

    console.log(sheet['name']);

    for (var rowId in sheet['data']) {

      console.log(rowId);

      var row = sheet['data'][rowId]; //第几行数据

      if (rowId > 0 && row{ //第一行是表格标题,所有我们要从第2行开始读

        //3,把解析到的数据存到excelList数据表里

        const promise = db.collection('SO_DB')

          .add({

            data: {

              BookingDate: row[0], //ETD

              ShipmentID: row[1], //进仓编号

              ShipperName: row[2], //供应商名字

              Volume: row[3],//立方

              UploadDate:new Date().toLocaleDateString()

            }

          })

        tasks.push(promise)

      }

    }

  });


  // 等待所有数据添加完成

  let result = await Promise.all(tasks).then(res => {

    return res

  }).catch(function(err) {

    return err

  })

  return result

}


回答关注问题邀请回答
收藏

1 个回答

  • xplee
    xplee
    发表于小程序端
    2020-07-16
    错误很明显, SO_DB 这个集合不存在,在云开发里先创建这样一个名称的集合
    2020-07-16
    有用
    回复 1
    • Jason_亮 🇨🇳
      Jason_亮 🇨🇳
      2020-07-16
      SO_DB数据库一直在的,我不是说了嘛,一个事件可以成功上传数据至数据库另外一个不可以。都是一样的代码和调用同一个云函数。后来,我把不成功的那个函数名称,jiexi()统一改了个别的名字,就成功了,说不清楚的原因。
      2020-07-16
      回复
登录 后发表内容
问题标签