当我在 Firebase 的 uploadImage 函数中需要它时,Busboy 似乎会导致内部服务器错误
Busboy seems to be causing an internal server error when requiring it in my uploadImage function for Firebase
我花了将近一整天的时间试图弄清楚如何将照片成功上传到我的存储和数据库中,但到目前为止我什至无法成功!
本质上,我使用 postman 发送一个 post 请求并附上图像文件。我认为我达到了所有要点,因为我将内容类型设置为 multipart/form-data,我在表单数据上有正文选项卡,并且我的文件行设置为文件而不是文本。
Photo of postman request and error
这个内部服务器错误是我无法解决的问题。
现在,在我下面的函数中,我需要 busboy,此时发生内部服务器错误,如果我在此之前放置一个 return,那么它将 return。但是,如果我在声明后放置 return,则会发生此错误。
const { admin, db } = require('../util/admin');
const config = require("../util/config");
...
exports.uploadImage = (req, res) => {
// res.send("this worked"); // everything works up to this point
const Busboy = require("busboy");
const path = require("path");
const os = require("os");
const fs = require("fs");
const busboy = new Busboy({ headers: req.headers });
let imageToBeUploaded = {};
let imageFileName;
busboy.on("file", (fieldname, file, filename, encoding, mimetype) => {
console.log(fieldname, file, filename, encoding, mimetype);
if (mimetype !== "image/jpeg" && mimetype !== "image/png") {
return res.status(400).json({ error: "Wrong file type submitted" });
}
// my.image.png => ['my', 'image', 'png']
const imageExtension = filename.split(".")[filename.split(".").length - 1];
// 32756238461724837.png
imageFileName = `${Math.round(
Math.random() * 1000000000000
).toString()}.${imageExtension}`;
const filepath = path.join(os.tmpdir(), imageFileName);
imageToBeUploaded = { filepath, mimetype };
file.pipe(fs.createWriteStream(filepath));
});
busboy.on("finish", () => {
admin
.storage()
.bucket()
.upload(imageToBeUploaded.filepath, {
resumable: false,
metadata: {
metadata: {
contentType: imageToBeUploaded.mimetype
}
}
})
.then(() => {
const images = `https://firebasestorage.googleapis.com/v0/b/${config.storageBucket}/o/${imageFileName}?alt=media`;
return db.doc(`/posts/${req.params.postId}`).update({ images });
})
.then(() => {
return res.json({ message: "image uploaded successfully" });
})
.catch(err => {
console.error(err);
return res.status(500).json({ error: "something went wrong" });
});
});
busboy.end(req.rawBody);
};
这是我的索引文件
const functions = require('firebase-functions');
const app = require('express')();
const FBAuth = require('./util/fbAuth')
const { getAllPosts, createOnePost, getThePost, deletePost, uploadImage } = require('./handlers/posts');
const { login } = require('./handlers/users');
// Posts Routes
app.get('/posts', getAllPosts);
app.get('/post/:postId', getThePost);
app.post("/post", FBAuth, createOnePost);
app.delete('/post/:postId', FBAuth, deletePost);
app.post('/post/:postId/image', FBAuth, uploadImage);
//TODO update post
// Login Route
app.post('/login', login)
exports.api = functions.https.onRequest(app)
当我在我的函数中声明 busboy 时似乎发生了什么导致了错误。我不知道为什么。
我应该提一下,当我使用带有“$ firebase serve”的本地主机时,代码似乎 运行,但 jpeg 图像并没有真正显示在 firestorage 中。
非常感谢大家提供的任何帮助,请随时询问更多信息!
我在代码中没有看到任何会导致内部服务器错误的内容。我想你实际上并没有用 npm 安装 busboy。您是否已进入函数文件夹并输入 "npm install busboy"?
我花了将近一整天的时间试图弄清楚如何将照片成功上传到我的存储和数据库中,但到目前为止我什至无法成功!
本质上,我使用 postman 发送一个 post 请求并附上图像文件。我认为我达到了所有要点,因为我将内容类型设置为 multipart/form-data,我在表单数据上有正文选项卡,并且我的文件行设置为文件而不是文本。 Photo of postman request and error
这个内部服务器错误是我无法解决的问题。
现在,在我下面的函数中,我需要 busboy,此时发生内部服务器错误,如果我在此之前放置一个 return,那么它将 return。但是,如果我在声明后放置 return,则会发生此错误。
const { admin, db } = require('../util/admin');
const config = require("../util/config");
...
exports.uploadImage = (req, res) => {
// res.send("this worked"); // everything works up to this point
const Busboy = require("busboy");
const path = require("path");
const os = require("os");
const fs = require("fs");
const busboy = new Busboy({ headers: req.headers });
let imageToBeUploaded = {};
let imageFileName;
busboy.on("file", (fieldname, file, filename, encoding, mimetype) => {
console.log(fieldname, file, filename, encoding, mimetype);
if (mimetype !== "image/jpeg" && mimetype !== "image/png") {
return res.status(400).json({ error: "Wrong file type submitted" });
}
// my.image.png => ['my', 'image', 'png']
const imageExtension = filename.split(".")[filename.split(".").length - 1];
// 32756238461724837.png
imageFileName = `${Math.round(
Math.random() * 1000000000000
).toString()}.${imageExtension}`;
const filepath = path.join(os.tmpdir(), imageFileName);
imageToBeUploaded = { filepath, mimetype };
file.pipe(fs.createWriteStream(filepath));
});
busboy.on("finish", () => {
admin
.storage()
.bucket()
.upload(imageToBeUploaded.filepath, {
resumable: false,
metadata: {
metadata: {
contentType: imageToBeUploaded.mimetype
}
}
})
.then(() => {
const images = `https://firebasestorage.googleapis.com/v0/b/${config.storageBucket}/o/${imageFileName}?alt=media`;
return db.doc(`/posts/${req.params.postId}`).update({ images });
})
.then(() => {
return res.json({ message: "image uploaded successfully" });
})
.catch(err => {
console.error(err);
return res.status(500).json({ error: "something went wrong" });
});
});
busboy.end(req.rawBody);
};
这是我的索引文件
const functions = require('firebase-functions');
const app = require('express')();
const FBAuth = require('./util/fbAuth')
const { getAllPosts, createOnePost, getThePost, deletePost, uploadImage } = require('./handlers/posts');
const { login } = require('./handlers/users');
// Posts Routes
app.get('/posts', getAllPosts);
app.get('/post/:postId', getThePost);
app.post("/post", FBAuth, createOnePost);
app.delete('/post/:postId', FBAuth, deletePost);
app.post('/post/:postId/image', FBAuth, uploadImage);
//TODO update post
// Login Route
app.post('/login', login)
exports.api = functions.https.onRequest(app)
当我在我的函数中声明 busboy 时似乎发生了什么导致了错误。我不知道为什么。
我应该提一下,当我使用带有“$ firebase serve”的本地主机时,代码似乎 运行,但 jpeg 图像并没有真正显示在 firestorage 中。
非常感谢大家提供的任何帮助,请随时询问更多信息!
我在代码中没有看到任何会导致内部服务器错误的内容。我想你实际上并没有用 npm 安装 busboy。您是否已进入函数文件夹并输入 "npm install busboy"?