[英]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.