簡體   English   中英

貓鼬設置函數與promise一起使用

[英]Mongoose set function using with promise

您好,我正在嘗試將字符串值設置為模型的列。 字符串值帶有promise,但不能返回。

    photoUrl: {
    type: String,
    set: setImage,
    default: ""
},

這是我的模特專欄

function setImage(base64) {
    uploadImage('users', base64).then(
        (publishUri) => {
            return publishUri
        }, 
        (err) => {
            return ''
        }
    )
}

這是我的設定功能

module.exports = {
    uploadImage: function(storageURI, base64) {
        return new Promise((res,rej) => {
            const storagePathURI = keys.devStorageURI + storageURI + '/';
            const uid = uuidv4();
            createFolder(storagePathURI, uid).then((fileUri, err) => {
                if (err) return rej(err)
                saveImage(fileUri, base64, storageURI, uid).then((publishStorageUri, err) => {
                    console.log(publishStorageUri)
                    console.log(err)
                    if (err) return rej(err)
                    return res(publishStorageUri)
                })
            })  
        })
    }
}

function createFolder(storagePathURI, uuid) {
    return new Promise((res,rej) => {
        mkdirp(storagePathURI, (err) => {
            if (err) return rej(err)
            const fileUri = storagePathURI + uuid + '.png';
            return res(fileUri);
        })
    })
}

function saveImage(fileUri, base64, storageURI, uuid) {
    return new Promise((res, rej) => {
        var base64Data = base64.replace(/^data:image\/png;base64,/, "");  
            fs.writeFile(fileUri, base64Data, 'base64', (err) => {
                if (err) return rej(err)
                return keys.prodPublishStorageURI + storageURI + '/'  + uuid + '.png';
            })
    })
}

這是我的存儲助手類

類運行良好,值正確返回,但是我的問題是我無法設置返回到photoUrl列的值,我該如何解決此問題

您將諾言與回調混淆了。 我對代碼進行了一些更改:

module.exports = {
  uploadImage: function (storageURI, base64) {
      const storagePathURI = keys.devStorageURI + storageURI + '/';
      const uid = uuidv4();
      //return a promise, createFolder returns a promise
      return createFolder(storagePathURI, uid)
      .then(
        fileUri =>
          //return result of saveImage (is a promise)
          saveImage(fileUri, base64, storageURI, uid)
      ).then(
        //in a promise chain you can return a value or promise of value
        //  if you return a value the next then is called with that value
        //  if you return a promise of value (like returning result of saveImage)
        //  the next then is called with the result of that promise
        publishStorageUri => {
          console.log("publish storage uri:",publishStorageUri);
          return publishStorageUri;
        }
      ).catch(
        err=>{
          console.warn("something went wrong:",err);
          //let code calling uploadImage know something went wrong
          return Promise.reject(err);
        }
      )
  }
}

const createFolder = (storagePathURI, uuid) =>
  new Promise(
    (res, rej) =>
      mkdirp(
        storagePathURI,
        (err) =>
          (err) 
            ? rej(err)
            : storagePathURI + uuid + '.png'
    )
  );

const saveImage = (fileUri, base64, storageURI, uuid) =>
  new Promise(
    (res, rej) =>
      fs.writeFile(
        fileUri,
        base64.replace(/^data:image\/png;base64,/, ""),
        'base64',
        (err) =>
          (err)
            ? rej(err)
            : keys.prodPublishStorageURI + storageURI + '/' + uuid + '.png'
      )
    );

根據您擰緊mkdirp此方法可能有效也可能無效。

更新

Mongoose模式中沒有異步的setter或getter,您可以在該模式上添加一個實例方法:

yourSchema.methods.setPhotoUrl = function () {
  return setImage()
  .then(
    publishUri=>
      this.setPhotoUrl=publishUri
  ).then(
    ()=>this//return this
  )
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM