MongoDB Stitch Webhook中'then is not a function'错误求助
问题原因与解决方案
这个错误既不是文档有误,也不是你操作错了——核心原因是Stitch函数编辑器的测试环境和实际Webhook触发环境的行为差异:
当你通过Webhook实际调用这个函数时,insertOne会返回一个Promise,所以.then()链式调用是有效的;但在编辑器控制台直接调用exports()测试时,insertOne会同步返回结果(而非Promise),自然就没有.then()方法,导致了这个TypeError。
修复方案:改用Async/Await写法(兼容测试与生产环境)
最稳妥的方式是把代码改成async/await风格,这种写法在同步和异步环境下都能正常工作,同时代码可读性更好:
exports = async function(payload, response) { const mongodb = context.services.get("mongodb-atlas"); const requestLogs = mongodb.db("test").collection("requestlogs"); try { const result = await requestLogs.insertOne({ body: EJSON.parse(payload.body.text()), query: payload.query }); response.setStatusCode(201); response.setBody(result.insertedId); return result; // 测试时可以直接看到返回结果 } catch (err) { response.setStatusCode(500); response.setBody(`插入失败:${err.message}`); throw err; // 测试时抛出错误便于调试 } };
测试时的临时处理(不改原代码的情况)
如果你不想修改原代码,在控制台测试时,可以直接获取insertOne的返回值,手动处理结果,而不是依赖.then():
// 控制台测试用的调用代码 const payload = {query: {arg1: 'hello', arg2: "world!"}, body:BSON.Binary.fromText('{"msg": "world"}')}; const response = { setStatusCode: (code) => console.log(`状态码:${code}`), setBody: (body) => console.log(`响应体:${body}`) }; // 直接获取insertOne的结果,不用.then链式调用 const mongodb = context.services.get("mongodb-atlas"); const requestLogs = mongodb.db("test").collection("requestlogs"); const result = requestLogs.insertOne({ body: EJSON.parse(payload.body.text()), query: payload.query }); response.setStatusCode(201); response.setBody(result.insertedId);
为什么文档里的代码没问题?
文档中的示例是针对实际Webhook触发场景的,在那个场景下insertOne确实会返回Promise,所以.then()是有效的。只是编辑器的测试环境为了方便调试,做了同步处理,导致行为不一致。
内容的提问来源于stack exchange,提问作者It'sNotMe
相关产品推荐
相关产品推荐

