busboy 遇到问题并且找不到 Content-Type

Posted

技术标签:

【中文标题】busboy 遇到问题并且找不到 Content-Type【英文标题】:Having problems with busboy and not finding Content-Type 【发布时间】:2020-04-18 14:50:52 【问题描述】:

我在尝试构建的某个应用程序中使用这个 busboy 包遇到困难,希望将图像从/上传到我的 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 de 错误中触发函数都是一样的,我也在分享它:

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)

【问题讨论】:

旁注:你应该使用if (request.method !== "POST") return response.status(405).set('Allow', 'POST').json( message: 'Not Allowed!!' ) 您能在提出请求的地方分享您的客户端代码吗? 另外,不要忘记使用cors(request, response, (err) => if (err) /* do something */ return; /* ... */ )处理来自cors的错误 最后,不要使用busBoy.end(request.rawBody);,而是使用request.pipe(busBoy);以获得更好的性能 好的,我已经添加了通过邮递员提出的请求,并尝试将您的建议应用于我的代码,但仍然不起作用 【参考方案1】:

对于使用postman 并遇到此问题的任何人:我没有意识到邮递员引用的文件不再存在,因此content-type 不存在,但postman 从未抱怨过。我切换到一个有效的文件,它工作。

【讨论】:

即使文件仍然存在,我也必须再次选择才能工作。【参考方案2】:

我自己遇到了这个。结果,busboy 模块中的 main.js 会检查 content-type 而不是 Content-Type,因此找不到标头。通过修复 main.js 中的大小写确认这是问题(在大多数情况下这不是可行的解决方案),之后构造函数调用按我的请求工作,如预期的那样。

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

【讨论】:

以上是关于busboy 遇到问题并且找不到 Content-Type的主要内容,如果未能解决你的问题,请参考以下文章

wordpress 插件开发 - 使用图像 - 找不到路径

Android:在已部署的应用程序中找不到资源异常

如何使用 Busboy 访问 Express 4 req.body 对象

找不到静态图像的控制器路径? asp.net mvc 路由问题?

添加 X-Content-Type-Options 无嗅探

在 VLC 和 python 中提取 rtmp 流时遇到问题,找不到直接流位置