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
相关产品推荐
相关产品推荐

