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

Next.js Serverless函数本地调用Odoo正常,部署至Vercel后失效

问题描述

使用Odoo外部API创建记录,在Postman中测试一切正常,但将Next.js Serverless函数部署到Vercel后,通过Supabase的webhook测试时,仅能打印请求中的record数据,后续Odoo相关逻辑无法执行。

日志截图

日志截图

当前API代码(api/residences)

var Odoo = require("odoo-xmlrpc");
export async function POST(req: Request) {
  const {record} = await req.json();
  console.log(record);

  var odoo = new Odoo({
    url: "http://159.223.227.196/",
    // port: <insert server Port (by default 80)>,
    db: "159.223.227.196",
    username: "admin",
    password: "admin",
  });
  // API KEY : b2618aa898366ea26e4c160031307871e7d7a87b
  // odoo.connect(function (err:any) {
  //   if (err) { return console.log(err); }
  //   console.log('Connected to Odoo server.');
  // });

  odoo.connect(function (err: any) {
    console.log("loading...");

    if (err) {
      return console.log(err);
    }
    console.log("Connected to Odoo server.");
    var params = [];
    params.push([{
      name:record.name,
      street:record.address,
      city:record.city
    }]);
    console.log(params);

    odoo.execute_kw(
      "res.company",
      "create",
      params,
      function (err: any, value: any) {
        if (err) {
          return console.log(err);
        }
        console.log("Result: ", value);
      }
    );
  });
  return new Response("company created succesfully!");
}
解决方案

1. 修复异步回调导致的函数提前终止

Next.js Serverless函数执行return后会立刻终止进程,当前代码用回调式处理Odoo操作,回调还没执行就被进程终止。需将回调改为Promise形式,用async/await确保Odoo操作完成后再返回响应:

修改后的代码:

var Odoo = require("odoo-xmlrpc");
export async function POST(req: Request) {
  try {
    const { record } = await req.json();
    console.log(record);

    const odoo = new Odoo({
      url: "http://159.223.227.196/",
      db: "159.223.227.196",
      username: "admin",
      password: "admin",
    });

    // 封装connect为Promise
    await new Promise<void>((resolve, reject) => {
      odoo.connect((err: any) => {
        if (err) {
          console.log(err);
          reject(err);
        } else {
          console.log("Connected to Odoo server.");
          resolve();
        }
      });
    });

    const params = [[{
      name: record.name,
      street: record.address,
      city: record.city
    }]];
    console.log(params);

    // 封装execute_kw为Promise
    const result = await new Promise<any>((resolve, reject) => {
      odoo.execute_kw(
        "res.company",
        "create",
        params,
        (err: any, value: any) => {
          if (err) {
            console.log(err);
            reject(err);
          } else {
            console.log("Result: ", value);
            resolve(value);
          }
        }
      );
    });

    return new Response(`company created succesfully! ID: ${result}`);
  } catch (error) {
    console.error("Error creating company:", error);
    return new Response("Failed to create company", { status: 500 });
  }
}

2. 检查Vercel网络访问权限

Vercel的Serverless函数默认可能无法访问公网中的Odoo服务器:

  • 确认Odoo服务器的防火墙/安全组已开放Vercel的出站IP段访问
  • 如果Odoo服务有IP白名单限制,需添加Vercel的IP到白名单中

3. 完善错误日志

修改后的代码用try/catch捕获所有错误,确保错误信息能打印到Vercel日志中,方便排查问题。

内容的提问来源于stack exchange,提问作者Baamel youssef

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 16:00:40