微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

获取 ENOENT:在谷歌云平台中托管 node.js api 后没有此类文件或目录错误

如何解决获取 ENOENT:在谷歌云平台中托管 node.js api 后没有此类文件或目录错误

我有一个将照片上传到谷歌云存储桶的 node.js api。我需要使用服务帐户 json 在谷歌云平台中托管这个 api。

以下是我使用的代码

app.yaml

# [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 举报,一经查实,本站将立刻删除。