I have the following old parse2 code that I need to upgrade to parse4. I have the following snippet of original code: EDIT: realized it was using old request (requestLib). I have replaced that with axios and now am showing my changes::
var query = new Parse.Query(request.params.documentType);
query.equalTo('objectId', request.params.documentObjectId);
return query.first({ useMasterKey: true })
.then(function (result) {
if (!result) { return Promise.error('Sorry, this document is not available to be sent.'); }
documentObject = result;
return result
})
.then(function(result){
if (useNewHTMLEmail) {
if (p.type === undefined) {
return console.log("type property must be defined for HTML template")
}
return Parse.Cloud.run("getEmail", {documentId: request.params.documentObjectId, type: p.type, text: baseMessage, documentType: p.documentType, customFields: p.customFields })
.then(function(result) {
baseMessage = result;
return true;
})
}
else {
return Promise.resolve();
}
})
.then(function (result) {
if (p.appendPDF == true && documentObject.get('pdf') !== undefined) {
var download = function (uri, filename, callback) {
requestLib.head(uri, function (err, res, body) {
console.log('content-type:', res.headers['content-type']);
console.log('content-length:', res.headers['content-length']);
requestLib(uri).pipe(fs.createWriteStream(filename)).on('close', callback);
});
};
var url = documentObject.get('pdf').url();
var parts = url.split("/");
var lastSegment = parts.pop() || parts.pop();
var promise = new Parse.Promise();
download(url, lastSegment, function () {
file = fs.readFileSync(lastSegment);
promise.resolve(result);
});
return promise;
}
else {
return Promise.resolve(result);
}
})
So far I have made the following changes:
var query = new Parse.Query(request.params.documentType);
query.equalTo('objectId', request.params.documentObjectId);
documentObject = await query.first({ useMasterKey: true });
if (documentObject === undefined){
throw new Error("Bad document in sendMail");
}
if (useNewHTMLEmail) {
if (p.type === undefined) {
throw new Error("type property must be defined for HTML template")
}
baseMessage = await Parse.Cloud.run("getEmail", {documentId: request.params.documentObjectId, type: p.type, text: baseMessage, documentType: p.documentType, customFields: p.customFields })
}
The next section is where I get confused using callbacks and async await. Here is my attempt with Axios:
var url = documentObject.get('pdf').url();
var parts = url.split("/");
var lastSegment = parts.pop() || parts.pop();
axios({
method: 'get',
url: url,
responseType:'stream'
})
.then(res => {
res.data.pipe(fs.createWriteStream(lastSegment));
})
.catch(err => console.log(err));
How do I translate this portion now:
var promise = new Parse.Promise();
download(url, lastSegment, function () {
file = fs.readFileSync(lastSegment);
promise.resolve(result);
});
EDIT: Why doesn't this pass through:
var writeStream = fs.createWriteStream(lastSegment);
await new Promise(async (resolve) => {
const response = await axios({
method: "GET",
url: url,
responseType: "stream"
});
response.data.pipe(writeStream);
writeStream.on('error', function (err) {
console.log(err);
});
});
file = fs.readFileSync(lastSegment); <=== never gets executed.
Thanks