gpt4 book ai didi

javascript - 云函数: HTTP trigger inconsistent batch commit

转载 作者:行者123 更新时间:2023-12-03 02:32:26 24 4
gpt4 key购买 nike

我正在尝试通过 HTTP 请求触发 Google 云功能来更新我的 Firestore 和 RTDB 中的多个集合,并且我已经进行了多次测试,但是批量提交有时有效 。我还尝试运行测试,从代码中排除 RTDB 更新,但没有太大变化。

如果出现问题,我会收到以下错误消息,状态代码为 500

Error: Cannot modify a WriteBatch that has been committed.

示例代码如下:

服务器端代码

'use strict';

module.exports = ({ admin, cors, express, functions }) => {
const app = express();
const fireStore = admin.firestore();
const rtdb = admin.database();
const apps = fireStore.collection('apps');
const users = fireStore.collection('users');
const batch = admin.firestore().batch();

app.use(cors({ origin: true }));

...

app.post('/', (req, res) => {
const uid = req.user.user_id;
const data = req.body;
const appsRef = apps.doc(uid);
const usersRef = users.doc(uid);

const activityState = {
currentActiveStatus: data.activityState.currentActiveStatus,
usingApp: data.activityState.usingApp
};

const appState = {
emailVerified: data.user.emailVerified
};

const userState = {
displayName: data.user.displayName,
photoURL: data.user.photoURL,
currentActiveStatus: data.user.currentActiveStatus,
lastLoginAt: admin.firestore.FieldValue.serverTimestamp()
};

batch.update(appsRef, appState);
batch.update(usersRef, userState);

return batch.commit().then(() => {
console.log('Batch commit finished!');
return admin.database().ref(`status/${uid}`).update(activityState).then(() => {
res.status(201).send({ message: 'Successfully Initialize Default State' });
});
}).catch(err => console.log('Err:', err));
});

return functions.https.onRequest(app);
};

客户端代码

const data = {
activityState: {
currentActiveStatus: "online",
usingApp: "true"
},
user: {
displayName: this.displayName,
photoURL: this.photoURL,
currentActiveStatus: "online",
emailVerified: "true"
}
};
this.userService.updateUserProfile(this.displayName, this.photoURL).then((accessToken) => {
const url = 'https://us-central1/dbname/cloudfunctions.net/functionname';
this.http.post(url, JSON.stringify(data), {
headers: {'Authorization': accessToken, 'Content-Type': 'application/json; charset=utf-8'}
}).subscribe((res) => {
// Worked well
}, (err) => {
// Went wrong
});
});

详细错误消息

Error: Cannot modify a WriteBatch that has been committed.  
at WriteBatch.verifyNotCommitted (/user_code/node_modules/firebase-admin/node_modules/@google-cloud/firestore/src/write-batch.js:148:13)
at WriteBatch.update (/user_code/node_modules/firebase-admin/node_modules/@google-cloud/firestore/src/write-batch.js:333:10)
at app.post (/user_code/exports/auth/user/startapp/initDefaultState.f.js:54:11)
at Layer.handle [as handle_request] (/user_code/node_modules/express/lib/router/layer.js:95:5)
at next (/user_code/node_modules/express/lib/router/route.js:137:13)
at Route.dispatch (/user_code/node_modules/express/lib/router/route.js:112:3)
at Layer.handle [as handle_request] (/user_code/node_modules/express/lib/router/layer.js:95:5)
at /user_code/node_modules/express/lib/router/index.js:281:22
at Function.process_params (/user_code/node_modules/express/lib/router/index.js:335:12)
at next (/user_code/node_modules/express/lib/router/index.js:275:10)

也许我的代码中遗漏了一些东西?

最佳答案

我解决了我的问题。这是我犯的一个愚蠢的错误。

我必须在 app.post() 中声明批处理。

app.post('/', (req, res) => {
const batch = admin.firestore().batch();
});

相反

module.exports = ({ admin, cors, express, functions }) => {
const app = express();
const fireStore = admin.firestore();
const rtdb = admin.database();
const apps = fireStore.collection('apps');
const users = fireStore.collection('users');
const batch = admin.firestore().batch();
};

关于javascript - 云函数: HTTP trigger inconsistent batch commit,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48676830/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com