图片上传错误:TypeError [ERR_INVALID_ARG_TYPE]:“ path”参数必须为字符串类型

时间:2019-09-04 10:35:47

标签: node.js firebase postman firebase-admin busboy

我正在使用node.js和firebase构建后端功能。我使用BusBoy构建了图片上传功能;

我一次又一次地检查我的代码,将图像更改为较小的大小(例如140 kb),并尝试检测到该问题,并且从代码中我认为编写该文件的路径名是某种问题上传的文件,在firebase serve中,显示错误:

  

TypeError [ERR_INVALID_ARG_TYPE]:“ path”参数必须为字符串类型。收到的类型未定义

  exports.uploadImage = (req, res) => {
  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 imageUrl = `https://firebasestorage.googleapis.com/v0/b/${
          config.storageBucket
        }/o/${imageFileName}?alt=media`;
        return db.doc(`/users/${req.user.handle}`).update({ imageUrl });
      })
      .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);
}; 

当我查看细节时,我意识到问题出在这一行: .upload(imageToBeUploaded.filepath,

我正在从邮递员发送发帖请求

有人可以帮助我吗?

完整的错误消息:

TypeError [ERR_INVALID_ARG_TYPE]: The "path" argument must be of type string.
Received type undefined 
> at validateString (internal/validators.js:125:11) 
> at Object.basename (path.js:1289:5) 
> at Bucket.upload (/Users/apple/Desktop/Oner/social_app/functions/node_modules/@google-cloud/storage/build/src/bucket.js:2237:38) 
> at PromiseCtor (/Users/apple/Desktop/Oner/social_app/functions/node_modules/@google-cloud/promisify/build/src/index.js:71:28)
> at new Promise (<anonymous>) 
> at Bucket.wrapper (/Users/apple/Desktop/Oner/social_app/functions/node_modules/@google-cloud/promisify/build/src/index.js:56:16) 
> at Busboy.busboy.on (/Users/apple/Desktop/Oner/social_app/functions/handlers/users.js:123:8) 
> at Busboy.emit (events.js:198:13) 
> at Busboy.emit (/Users/apple/Desktop/Oner/social_app/functions/node_modules/busboy/lib/main.js:37:33) 
> at /Users/apple/Desktop/Oner/social_app/functions/node_modules/busboy/lib/types/multipart.js:304:17

3 个答案:

答案 0 :(得分:1)

任何有相同问题的人,要解决此问题,必须将firebase-tools回滚到以前的版本:

在功能文件夹中

npm rm firebase-tools
npm i -g firebase-tools@6.8.0

然后将“ config.storageBucket”添加到“完成”事件处理程序中的.bucket()中。

答案 1 :(得分:1)

代码没什么不对,只是从邮递员头中删除Content-Type。它对我有用

答案 2 :(得分:0)

我了解您正在尝试在邮递员中测试您的代码。我遇到了同样的问题。 正品要求: 只需尝试在POSTMAN中打开新标签页,不要重复,可以从其他任何地方继承。 添加图像,添加其他任何相关的标头,例如不记名令牌等,然后点击发送。

我真的不知道该怎么变,但是我认为邮递员在使用身体类型时会添加不同的标题...这会导致问题。