与服务员有问题并且找不到内容类型

问题描述 投票:0回答:3

我在一些应用程序中遇到了困难,我正在尝试构建想要从我的 firebase 上传图像/到我的 firebase 的图像... 已经尝试查看一些具有相同问题但可能不同代码的可能解决方案,但它不起作用。 我可以分享我的,以便您可以告诉我出了什么问题吗? 这几行是:

const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp()
const path = require('path');
const os = require('os');
const cors = require('cors')({ origin: true });
const BusBoy = require('busboy')
const fs = require('fs');
const gcConfig = {
    projectId: 'meeting-scheduler-9cee1',
    keyFilename: "meeting-scheduler-9cee1-firebase-adminsdk-3unr4-09df5fe69a.json"
}
const { Storage } = require("@google-cloud/storage");


exports.upLoadFile = functions.https.onRequest((request, response) => {
    cors(request, response,() => {
        const busBoy = new BusBoy({ headers: request.headers});
        let uploadData = null;
        if (request.method !== "POST") {
            return response.status(500).json({
                message: 'Not Allowed!!'
            })
        }

        // if (!request.headers['Content-Type']){
        //     return next(new Error('Bad request'));
        // }
        //   else
        //    next();

        busBoy.on('file', (fieldname, file, filename, encoding, mimetype) => {
            const filepath = path.join(os.tmpdir(), filename);
            uploadData = { file: filepath, type: mimetype };
            file.pipe(fs.createWriteStream(filepath));
        });
        busBoy.on('finish', () => {
            const bucket = gcs.bucket('meeting-scheduler-9cee1.appspot.com');
            bucket
                .upload(uploadData.file, {
                    uploadType: 'media',
                    metadata: {
                        metadata: {
                            contentType: uploadData.type
                        }
                    }
                })
                .then(() => {
                    response.status(200).json({
                        message: 'It Works!'
                    });
                })
                .catch(err => {

                    response.status(500).json({
                        error: err
                    })
                })
    });
    busBoy.end(request.rawBody);


});

}); 

任何时候我在 firebase 中触发该函数时错误都是相同的,我也分享它:

Error: Missing Content-Type
    at new Busboy (/srv/node_modules/busboy/lib/main.js:23:11)
    at cors (/srv/index.js:58:24)
    at cors (/srv/node_modules/cors/lib/index.js:188:7)
    at /srv/node_modules/cors/lib/index.js:224:17
    at originCallback (/srv/node_modules/cors/lib/index.js:214:15)
    at /srv/node_modules/cors/lib/index.js:219:13
    at optionsCallback (/srv/node_modules/cors/lib/index.js:199:9)
    at corsMiddleware (/srv/node_modules/cors/lib/index.js:204:7)
    at exports.upLoadFile.functions.https.onRequest (/srv/index.js:57:5)
    at cloudFunction (/srv/node_modules/firebase-functions/lib/providers/https.js:49:9)
javascript firebase vue.js vuex busboy
3个回答
10
投票

我自己也遇到过这个。事实证明,busboy 模块中的 main.js 检查的是

content-type
而不是
Content-Type
,因此找不到标头。通过修复 main.js 中的大小写(在大多数情况下这不是一个可行的解决方案)来确认这是问题所在,之后构造函数调用按照我的要求工作,如预期的那样。

显然这是之前提出过的,但问题已关闭(link)。


1
投票

对于任何使用

postman
并遇到此问题的人:我没有意识到邮递员引用的文件不再存在,因此
content-type
不存在,但
postman
从未抱怨过。我切换到有效的文件并且它起作用了。


0
投票

正如 Kacey 指出的,busboy 抛出此错误是因为 HTTP 请求不包含

Content-Type
标头。

HTTP 标头在到达 Node 后默认以小写形式写入,无论您如何在前端定义它们,从而导致此错误。

我通过简单地将以下行添加到我的代码中来解决它:

app.use((req, res, next) => {
  req.headers['Content-Type'] = req.headers['content-type']; next();
})
app.use(busboy()); 
© www.soinside.com 2019 - 2024. All rights reserved.