使用 firebase 云功能将图像保存到 gcloud
Saving Image to gcloud with firebase cloud function
我想在云功能中保存从 unsplash 中选择的图像 - 运行 它在后台。这是我的代码:
export const getUnsplashCron = functions
.region('europe-west1')
.runWith({ memory: '512MB', timeoutSeconds: 15 })
.https.onRequest(async(req, res) => {
if (!req.query.url) {
res.status(300).send('no url');
}
return request({
url: req.query.url + '?client_id=' + environment.unsplash.appId,
encoding: null
}, (err, response, body) => {
if (!err && response.statusCode === 200) {
const stream = require('stream');
const bufferStream = new stream.PassThrough();
bufferStream.end(Buffer.from(body, 'base64'));
const file = admin.storage().bucket().file('name.jpg');
bufferStream.pipe(
file.createWriteStream({
public: true
}))
.on('error', function(error) {
console.log(error);
return res.status(500).send(error)
})
.on('finish', function() {
const config: GetSignedUrlConfig = {
action: 'read',
expires: '01-01-2025'
};
file.getSignedUrl(config, function(error, url) {
console.log(url);
if (error) {
return res.status(500).send(error);
}
return res.status(500).send(url);
});
});
}
});
});
但是我得到了
Error: Not Found
at Util.parseHttpRespBody (/srv/node_modules/@google-cloud/common/build /src/util.js:172:38)
at Util.handleResp (/srv/node_modules/@google-cloud/common/build/src/util.js:116:117)
at retryRequest (/srv/node_modules/@google-cloud/common/build/src/util.js:404:22)
at onResponse (/srv/node_modules/retry-request/index.js:200:7)
at /srv/node_modules/teeny-request/build/src/index.js:158:17
at
at process._tickDomainCallback (internal/process/next_tick.js:229:7)
code: 404,
errors:
[ { domain: 'global', reason: 'notFound', message: 'Not Found' } ],
response: undefined,
message: 'Not Found' }
我做错了什么?!
您应该使用承诺来处理异步任务(例如对 unsplash 的 HTTP 调用或对云存储的写入)。默认情况下 request
不会 return promises,所以你需要为请求使用接口包装器,比如 request-promise
.
因此您应该按如下方式修改您的代码:
const rp = require('request-promise');
.....
export const getUnsplashCron = functions
.region('europe-west1')
.runWith({ memory: '512MB', timeoutSeconds: 15 })
.https.onRequest(async(req, res) => {
.......
const options = {
uri: req.query.url + '?client_id=' + environment.unsplash.appId
};
rp(options)
.then(response => {
.... //Upload your file
res.send('Success');
})
.catch(err => {
// API call failed...
res.status(500).send('Error': err);
});
};
您可以观看此官方视频系列以了解更多详情:https://firebase.google.com/docs/functions/video-series/(尤其是标题为 "Learn JavaScript Promises" 的 3 个视频)。
我想在云功能中保存从 unsplash 中选择的图像 - 运行 它在后台。这是我的代码:
export const getUnsplashCron = functions
.region('europe-west1')
.runWith({ memory: '512MB', timeoutSeconds: 15 })
.https.onRequest(async(req, res) => {
if (!req.query.url) {
res.status(300).send('no url');
}
return request({
url: req.query.url + '?client_id=' + environment.unsplash.appId,
encoding: null
}, (err, response, body) => {
if (!err && response.statusCode === 200) {
const stream = require('stream');
const bufferStream = new stream.PassThrough();
bufferStream.end(Buffer.from(body, 'base64'));
const file = admin.storage().bucket().file('name.jpg');
bufferStream.pipe(
file.createWriteStream({
public: true
}))
.on('error', function(error) {
console.log(error);
return res.status(500).send(error)
})
.on('finish', function() {
const config: GetSignedUrlConfig = {
action: 'read',
expires: '01-01-2025'
};
file.getSignedUrl(config, function(error, url) {
console.log(url);
if (error) {
return res.status(500).send(error);
}
return res.status(500).send(url);
});
});
}
});
});
但是我得到了
Error: Not Found at Util.parseHttpRespBody (/srv/node_modules/@google-cloud/common/build /src/util.js:172:38) at Util.handleResp (/srv/node_modules/@google-cloud/common/build/src/util.js:116:117) at retryRequest (/srv/node_modules/@google-cloud/common/build/src/util.js:404:22) at onResponse (/srv/node_modules/retry-request/index.js:200:7) at /srv/node_modules/teeny-request/build/src/index.js:158:17 at at process._tickDomainCallback (internal/process/next_tick.js:229:7) code: 404, errors: [ { domain: 'global', reason: 'notFound', message: 'Not Found' } ], response: undefined, message: 'Not Found' }
我做错了什么?!
您应该使用承诺来处理异步任务(例如对 unsplash 的 HTTP 调用或对云存储的写入)。默认情况下 request
不会 return promises,所以你需要为请求使用接口包装器,比如 request-promise
.
因此您应该按如下方式修改您的代码:
const rp = require('request-promise');
.....
export const getUnsplashCron = functions
.region('europe-west1')
.runWith({ memory: '512MB', timeoutSeconds: 15 })
.https.onRequest(async(req, res) => {
.......
const options = {
uri: req.query.url + '?client_id=' + environment.unsplash.appId
};
rp(options)
.then(response => {
.... //Upload your file
res.send('Success');
})
.catch(err => {
// API call failed...
res.status(500).send('Error': err);
});
};
您可以观看此官方视频系列以了解更多详情:https://firebase.google.com/docs/functions/video-series/(尤其是标题为 "Learn JavaScript Promises" 的 3 个视频)。