我正在使用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
答案 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中打开新标签页,不要重复,可以从其他任何地方继承。 添加图像,添加其他任何相关的标头,例如不记名令牌等,然后点击发送。
我真的不知道该怎么变,但是我认为邮递员在使用身体类型时会添加不同的标题...这会导致问题。