程序问答   发布时间:2022-05-31  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了意外的 < 在 JSON 位置 0 && 错误:缺少 S3 密钥 - MERN 应用程序、Heroku大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决意外的 < 在 JSON 位置 0 && 错误:缺少 S3 密钥 - MERN 应用程序、Heroku?

开发过程中遇到意外的 < 在 JSON 位置 0 && 错误:缺少 S3 密钥 - MERN 应用程序、Heroku的问题如何解决?下面主要结合日常开发的经验,给出你关于意外的 < 在 JSON 位置 0 && 错误:缺少 S3 密钥 - MERN 应用程序、Heroku的解决方法建议,希望对你解决意外的 < 在 JSON 位置 0 && 错误:缺少 S3 密钥 - MERN 应用程序、Heroku有所启发或帮助;

我在问题标题中合并了这两件事,因为我相信它们是相关的。

我有一个部署到 Heroku 的 MERN + Redux 应用程序。该应用程序是供艺术家上传他的图像​​的,因此我使用multer将图像文件存储在app/uploads/目录中,同时将记录保存在MongoDB Atlas Cloud存储中。

这很好,但当然 Heroku 的文件存储是短暂的,所以我决定使用 S3 存储桶进行存储。

我想出了如何将图像发布到 S3 存储桶的方法,但我是通过以下方式实现的:

const express = require('express');
const router = express.Router();
const upload = require('../../mIDdleware/upload');     <<~~ multer diskStorage
const fs = require('fs');
const AWS = require('aws-sdk');
const dotenv = require('dotenv');
dotenv.config();

// Commission model
const commission = require('../../models/Commission');

// AWS Configuration
const ID = process.env.AWS_ACCESS_KEY_ID;
const SECRET = process.env.AWS_SECRET_ACCESS_KEY;
const BUCKEt_name = process.env.S3_BUCKET;
const s3 = new AWs.S3({
  accessKeyID: ID,secretAccessKey: SECRET
});

const uploadfile = (imagename,imagedata) => {
  const fileContent = fs.readfileSync(imagedata);

  const params = {
    Bucket: BUCKEt_name,Key: imagename,Body: fileContent
  };

  s3.upload(params,function(err,data) {
    if(err) {
      throw err;
    }
    console.log(`file uploaded to S3 successfully: ${data.LOCATIOn}`)
  });
};

// @route   POST /commissions
// @descrip Create a new commission
// @access  Private
router.route('/').post(upload.single('imageData'),authorize,(req,res) => {
  uploadfile(req.body.imagename,req.file.path);

  const newCommission = new Commission({
    imagename: req.body.imagename,imageData: req.file.path,title: req.body.title,description: req.body.description,price: req.body.price
  });

  newCommission.save()
    .then(commission => res.Json(commission))
    .catch(err => res.status(400).Json(`Create new commission Failed: ${err}`));
});

除了添加了 upload 函数外,这条路线基本上没有改变。

无论如何,这在以下方面有效:

  • 发布 mongo 文档

  • 将文件保存到我的 S3 存储桶

它实际上并没有显示我存储桶中的任何内容。我怀疑是因为在我的 app/server.Js 文件中,我仍在使用:

app.use('/uploads',express.static('uploads'));

所以我安装了 s3-proxy 并且在我的 server.Js 中写道:

const s3Proxy = require('s3-proxy');
 
app.get('/media/*',s3Proxy({
  bucket: process.env.S3_BUCKET,accessKeyID: process.env.AWS_ACCESS_KEY_ID,secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY,overrIDeCachecontrol: 'max-age=100000',defaultKey: 'index.HTML'
}));

这……似乎什么也没做。所以我修改了 prefix 选项,把我的 S3 存储桶的 URL。 在我修修补补和几个 localhost 页面重新加载期间,我的文档突然卡在 loading 状态。

我打开了 devtools 并在 console 中读取

SyntaxError: Unexpected token < in JsON at position 0

network 标签中有许多错误,他们都说

Error: Missing S3 key

该应用程序在 Heroku/production 上工作(显然没有图像功能),没有网络选项卡错误,但在本地这被破坏了。

我找到了专注于可能的代码错误和拼写错误的解决方案,但我没有做出任何解决方案。我什至将更改恢复到应用完全正常运行时。

我发现 node_modules 中以某种方式发生了建议的损坏的一个解决方案,所以我完全删除了它们并再次运行 npm i 进行重置。

没有用,所以我再试一次,但也删除了 package-lock.Json

我没有想法了。在现在与 S3 没有连接的应用程序中“缺少 S3 密钥”(我卸载了 aws-sdk 和 s3-proxy 包,并删除了代码)

解决方法

通过清除浏览器缓存历史解决了问题。

大佬总结

以上是大佬教程为你收集整理的意外的 < 在 JSON 位置 0 && 错误:缺少 S3 密钥 - MERN 应用程序、Heroku全部内容,希望文章能够帮你解决意外的 < 在 JSON 位置 0 && 错误:缺少 S3 密钥 - MERN 应用程序、Heroku所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。