如何解决获取 ENOENT:在谷歌云平台中托管 node.js api 后没有此类文件或目录错误
我有一个将照片上传到谷歌云存储桶的 node.js api。我需要使用服务帐户 json 在谷歌云平台中托管这个 api。
以下是我使用的代码:
# [START gae_quickstart_yaml]
runtime: nodejs14
# [END gae_quickstart_yaml]
entrypoint:
serve index.js
automatic_scaling:
target_cpu_utilization: 0.65
min_instances: 5
max_instances: 100
min_pending_latency: 30ms
max_pending_latency: automatic
max_concurrent_requests: 50
index.js:
'use strict';
// [START gae_node_request_example]
const express = require('express');
const app = express();
app.use(require('./routes'));
app.get('/',(req,res) => {
res.status(200).send('Hello,world!').end();
});
// Start the server
const PORT = process.env.PORT || 8080;
app.listen(PORT,() => {
console.log(`App listening on port ${PORT}`);
console.log('Press Ctrl+C to quit.');
});
// [END gae_node_request_example]
module.exports = app;
routes.js:
var express = require('express');
var router = express.Router();
const Multer = require('multer');
const imgUpload = require('./ImgUpload.js');
const multer = Multer({
storage: Multer.MemoryStorage,fileSize: 5 * 1024 * 1024
});
//Multipart request (Accept one file where the name of the form field is named photo)
router.post('/file_upload',multer.single('photo'),imgUpload.uploadToGcs,function (req,res,next) {
console.log(req.file);
const data = req.body;
//const emailId = req.emailId;
console.log('data:'+data);
if (req.file && req.file.cloudStoragePublicUrl) {
data.imageUrl = req.file.cloudStoragePublicUrl;
}
res.send(data);
});
module.exports = router;
ImgUpload.js:
'use strict';
const fs = require('fs')
const base64_encode = require('locutus/PHP/url/base64_encode')
const {Storage} = require('@google-cloud/storage');
var projectId = 'vast-service-281617' // Your Google Cloud Platform project ID
const path = require('path');
var keyFilename = path.relative('workspace/','firebasekey.json');
const storage = new Storage({keyFilename,projectId});
const bucketName = storage.bucket('jtg_app_bucket')
function getRandomSalt() {
var milliseconds = new Date().getTime();
var timestamp = (milliseconds.toString()).substring(9,13)
var random = ("" + Math.random()).substring(2,8);
var random_number = timestamp+random; // string will be unique because timestamp never
repeat itself
var random_string = base64_encode(random_number).substring(2,8); // you can set size here
of return string
var return_string = '';
var Exp = /((^[0-9]+[a-z]+)|(^[a-z]+[0-9]+))+[0-9a-z]+$/i;
if (random_string.match(Exp)) { //check here whether string is alphanumeric
or not
return_string = random_string;
} else {
return getRandomSalt(); // call recursivley again
}
return return_string;
}
function getPublicUrl(filename) {
return 'https://storage.googleapis.com/' + bucketName + '/'+ filename;
}
let ImgUpload = {};
ImgUpload.uploadToGcs = (req,next) => {
if(!req.file) return next();
// Can optionally add a path to the gcsname below by concatenating it before the filename
//const folder = 'jtgMediaApp';
const folder = getRandomSalt();
const gcsname = folder+'/'+req.file.originalname;
const file= bucketName.file(gcsname);
const stream = file.createWriteStream({
Metadata: {
contentType: req.file.mimetype
}
});
stream.on('error',(err) => {
req.file.cloudStorageError = err;
next(err);
});
stream.on('finish',() => {
req.file.cloudStorageObject = gcsname;
req.file.cloudStoragePublicUrl = getPublicUrl(gcsname);
next();
});
stream.end(req.file.buffer);
}
module.exports = ImgUpload;
该 api 在本地运行良好,但在谷歌云服务器中不起作用。 问题是 keyFilename 中的路径。我已经给出了服务帐户 json 的相对路径。托管后我收到以下错误:
错误:ENOENT:没有那个文件或目录,打开'/service_accountkey.json'
我的服务帐户json的实际路径是我的MacOS中的/Users/poornima.c/Documents/Project_Folder/workspace/service_accountkey.json 系统。
谁能帮我解决我出错的地方。提前致谢。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。