Node.js TypeError:无法读取属性';通过tellength';用nodejs定义的未定义的
我无法理解为什么firebase不接受该图像,出现以下消息:TypeError:无法读取未定义的属性“ByTeleLength” 我试图将“byteLength”值添加到我的对象(req.file)中,但同样的错误仍然存在 下面是我的实现Node.js TypeError:无法读取属性';通过tellength';用nodejs定义的未定义的,node.js,firebase,Node.js,Firebase,我无法理解为什么firebase不接受该图像,出现以下消息:TypeError:无法读取未定义的属性“ByTeleLength” 我试图将“byteLength”值添加到我的对象(req.file)中,但同样的错误仍然存在 下面是我的实现 const firebase2 = require('firebase/app'); require('firebase/storage'); router.put('/addimage', multer.single('picture'), async
const firebase2 = require('firebase/app');
require('firebase/storage');
router.put('/addimage', multer.single('picture'), async (req, res, next) => {
const newName = uuidv1() + "-" + req.file.originalname;
var storageRef = firebase2.storage().ref('photo/'+ newName);
storageRef.put(req.file);
});
这个html示例是我做的。我想做一个后端,所以我要迁移到nodejs
<html>
<head>
<meta charset="utf-8">
<title>Teste</title>
<style>
body {
display: flex;
min-height: 100vh;
width: 100%;
padding: 0;
margin: 0;
align-items: center;
justify-content: center;
flex-direction: column;
}
#uploader {
-webkit-appearance: none;
appearance: none;
width: 50%;
margin-bottom: 10%;
}
</style>
</head>
<body>
<progress value="0" max="100" id="uploader">0%</progress>
<input type="file" value="upload" id="fileButton"></input>
<script src="https://gstatic.com/firebasejs/live/3.0/firebase.js"></script>
<script>
// Your web app's Firebase configuration
// For Firebase JS SDK v7.20.0 and later, measurementId is optional
var firebaseConfig = {
apiKey: "xxxxx",
authDomain: "xxxxx",
projectId: "xxxxx",
storageBucket: "xxxxxxx",
messagingSenderId: "xxxxxx",
appId: "xxxxxxx",
measurementId: "xxxxxx"
};
// Initialize Firebase
firebase.initializeApp(firebaseConfig);
var uploader = document.getElementById('uploader');
var fileButton = document.getElementById('fileButton');
fileButton.addEventListener('change', function(e){
var file = e.target.files[0];
var storageRef = firebase.storage().ref('sweet_fifs/'+ file.name);
var task = storageRef.put(file);
task.on('state_changed',
function progress(snapshot) {
var percetage = (snapshot.bytesTransferred / snapshot.totalBytes) * 100;
uploader.value = percetage;
},
function error(err) {
}
)
});
</script>
</body>
睾丸
身体{
显示器:flex;
最小高度:100vh;
宽度:100%;
填充:0;
保证金:0;
对齐项目:居中;
证明内容:中心;
弯曲方向:立柱;
}
#上传器{
-webkit外观:无;
外观:无;
宽度:50%;
利润底部:10%;
}
0%
//您的web应用程序的Firebase配置
//对于Firebase JS SDK v7.20.0及更高版本,measurementId是可选的
var firebaseConfig={
apiKey:“xxxxx”,
authDomain:“xxxxx”,
projectId:“xxxxx”,
storageBucket:“xxxxxxx”,
messagingSenderId:“xxxxxx”,
appId:“xxxxxxx”,
度量标准:“xxxxxx”
};
//初始化Firebase
firebase.initializeApp(firebaseConfig);
var uploader=document.getElementById('uploader');
var fileButton=document.getElementById('fileButton');
fileButton.addEventListener('change',函数(e){
var file=e.target.files[0];
var storageRef=firebase.storage().ref('sweet_fifs/'+file.name);
var task=storageRef.put(文件);
task.on('state_changed',
功能进度(快照){
var percetage=(snapshot.bytesttransfered/snapshot.totalBytes)*100;
uploader.value=percetage;
},
函数错误(err){
}
)
});
该方法需要一个Blob | Uint8Array | ArrayBuffer
作为第一个参数。您提供的req.file
对象不是这些。但是,我们可以看到有一个缓冲区对象作为req.file
对象的属性可用,该缓冲区中的内容类型也是如此。因此,我们所需要做的就是取出这些值并将它们传递给Reference\put()
。另外,不要忘记为用户创建响应并处理任何错误
router.put('/addimage', multer.single('picture'), async (req, res, next) => {
const newName = uuidv1() + "-" + req.file.originalname;
const storageRef = firebase2.storage().ref('photo/'+ newName);
storageRef.put(req.file.buffer, {
contentType: req.file.mimetype
})
.then(() => storageRef.getDownloadURL()) // after upload, obtain the download URL
.then(
(url) => {
// persisted to storage successfully and obtained download URL
res
.status(201)
.set("Content-Location", url) // use "Location" if you want to redirect to it
.json({
"message": "Upload successful"
});
},
(err) => {
// failed to save to storage
logger.error({
message: "Upload failed with error",
errorMessage: err.message,
errorStack: err.stack
});
res
.status(500)
.json({
"message": "Upload failed",
"error": err.code || "unknown"
});
}
)
.catch((err) => {
// if here, something has gone wrong while sending back the response
// likely a syntax error, or sending responses multiple times
logger.error({
message: "Unexpected rejection during /addImage",
errorMessage: err.message,
errorStack: err.stack
});
});
});
您的路由器在哪里运行?在谷歌云功能、Firebase云功能或您自己的NodeJS安装中?我在Firebase上放置的图像我的应用程序在Heroku上。非常感谢您的帮助,我非常高兴。当尝试应用您评论的解决方案时,它生成了另一个错误,如下图所示。正在等待调试器断开连接。。。C:\workspace\Job4You\node_modules\@firebase\storage\dist\index.cjs.js:515 this.xhr\uxur=new-XMLHttpRequest();^ReferenceError:XMLHttpRequest未在新网络中定义是的,我忘了提到firebase/storage
是SDK中仅用于浏览器的一部分。如果您想从节点访问云存储,您应该使用来访问。感谢您的帮助,我不明白,甚至不知道如何使用firebase admin,我会像您一样继续研究。@Sandrofirebase admin
是firebase
SDK的一个版本,设计用于在服务器上而不是浏览器上运行。对于大多数调用,您使用它的方式与firebase
相同-使用import*作为管理员从“firebase admin”
导入时,只需将firebase
交换为admin
。看看这本书,非常感谢。你有上传这张图片的例子吗?我无法使用这个firebase管理员,也无法理解您是如何使用它的。请记住,我正在为我的大学做nodejs后端,我没有使用屏幕来获取文件,我是通过邮递员(rest)使用它的