You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:05:38