javascript - Firebase 响应:未定义不是对象
问题描述
我正在尝试将数据保存到 Firebase 存储中。
通常,我的方法和功能有效,在 FireBase 日志中我得到:
函数执行耗时 1442 毫秒,完成状态码:201
警报15
alert14: null||[object 对象]
警报12:
警报11:
未配置结算帐号。外部网络无法访问,配额受到严格限制。配置结算帐户以删除这些限制
函数执行开始
我的功能:
const functions = require('firebase-functions');
const cors = require("cors")({origin: true});
const fs = require("fs");
const UUID = require("uuid-v4");
const gcconfig = {
projectId: "myrojectid",
keyFilename: "mykeyfile.json"
};
const gcs = require("@google-cloud/storage")(gcconfig);
// // Create and Deploy Your First Cloud Functions
// // https://firebase.google.com/docs/functions/write-firebase-functions
//
exports.storeImage = functions.https.onRequest((request, response) => {
console.log("alert11: ")
cors(request, response, () => {
console.log("alert12: ")
const body = JSON.parse(request.body);
fs.writeFileSync("/tmp/uploaded-image.jpg", body.image, "base64", err => {
console.log(err => console.log("alert13: " + err));
return response.status(500).json({error: err})
});
const bucket = gcs.bucket("myapp.appspot.com");
const uuid = UUID();
bucket.upload(
"/tmp/uploaded-image.jpg",
{
uploadType: "media",
destination: "/places2/" + uuid + ".jpg",
metadata: {
metadata: {
contentType: "image/jpeg",
firebaseStorageDownloadTokens: uuid
}
}
}, (err, file) => {
console.log("alert14: " + err + "||" + file)
if (!err) {
console.log("alert15");
response.status(201).json({
imageUrl:
"https://firebasestorage.googleapis.com/v0/b/" +
bucket.name +
"/o/" +
encodeURIComponent(file.name) +
"?alt=media&token=" +
uuid
})
} else {
console.log("alert16: ")
console.log(err);
response.status(500).json({error: err})
}
});
});
});
我的方法:
import {ADD_PLACE, DELETE_PLACE} from './actionTypes';
export const addPlace = (placeName, location, image) => {
return dispatch => {
fetch("https://us-central1-myapp.cloudfunctions.net/storeImage", {
method: "POST",
body: JSON.stringify({
image: image.base64
})
})
.catch(err=> console.log(err))
.then(res => {res.json(); console.log("alert2 " + {res})})
.then(parsedRes => {
console.log("alert1: " + parsedRes);
const placeData = {
name: placeName,
location: location,
image: parsedRes.imageUrl
};
return fetch("https://myapp.firebaseio.com/places.json", {
method: "POST",
body: JSON.stringify(placeData)
}).catch(err => console.log("alert13: " + err))
})
.catch(err => console.log("alert4", err))
.then(res => res.json())
.catch(err => console.log("alert5: " + err))
.then(parsedRes => {
console.log("alert6", parsedRes);
}).catch(err => console.log("alert17: " + err));
};
};
export const deletePlace = (key) => {
return {
type: DELETE_PLACE,
placeKey: key
};
};
但在我的 IDE 的本地控制台中,我得到了这个:
- 警报1:未定义
- 'alert4', { [TypeError: undefined is not an object (evalating 'parsedRes.imageUrl')]
我为此浪费了 3 天时间,但进度仍然为 0。
这里有什么问题?如何解决?
解决方案
您没有正确使用承诺链接。您需要将then()
回调的结果显式返回给链中的下一个处理程序。不返回任何内容,下一个then()
回调将变得未定义。例如:
.then(res => {res.json(); console.log("alert2 " + {res})})
在这行代码中,您不会返回任何内容以传递给链中的下一个处理程序。
事实上,上述then()
回调是不必要的,因为它不会启动任何其他异步工作。您可以在第二次提取之前调用res.json()
后续块。then()
您通常仅在then()
由于先前的异步工作而有更多异步工作要做时才添加另一个块。
推荐阅读
- node.js - aws-sdk NodeJS 从环境变量中读取凭证
- pandas - 减去同一行和列中但在不同数据框文件中的值
- python - 用 Python 编写期货(asyncio)
- asp.net-core - 如何注入对特定 IHostedService 实现的引用?
- python - Apache Beam 将每个标记的输出写入单独的文件
- javascript - 有谁知道为什么我在安装 airbnb 时收到此 eslint 错误消息
- spring-data-jpa - 无法在 JPA+spring Data 中设置简单的 LIKE+ignore case 查询
- ios - 如何在访问用户位置时添加自定义消息?
- python - 使用递归函数对整数进行洗牌
- azure-ad-b2c - Azure B2C - 如何添加额外的身份验证字段?