在Odoo中使用execjs创建定时弹窗报错:alert未定义
问题分析与解决方案
你遇到的ReferenceError: alert is not defined错误,核心原因是**execjs运行的是服务器端的JavaScript环境,而alert()是浏览器(客户端)专属的API**——服务器端的JS runtime(比如Node.js、PyV8这类)根本没有浏览器的window对象,自然找不到alert函数。
你的需求是给用户弹出定时提醒,用服务器端调用execjs的思路从一开始就走偏了,因为弹窗是要在用户的浏览器里显示的,不是在Odoo服务器上显示。下面给你两种符合Odoo生态的正确实现方式:
方式一:前端触发客户端通知(适合页面内定时提醒)
如果你的提醒是在用户打开Odoo页面时触发,可以直接在Odoo的前端JS代码里实现定时弹窗:
// 在Odoo的前端组件中添加定时逻辑 odoo.define('your_module.alert', function(require) { "use strict"; var core = require('web.core'); var Widget = require('web.Widget'); var AlertWidget = Widget.extend({ start: function() { // 设定定时提醒,比如1小时后弹窗 setTimeout(() => { // 使用Odoo自带的通知组件,比原生alert更贴合系统风格 this.do_notify('提醒', 'Hello World!!', false); // 如果一定要用原生alert也可以: // alert("Hello World!!"); }, 3600000); // 毫秒数,这里是1小时 return this._super.apply(this, arguments); }, }); core.action_registry.add('your_module.alert_widget', AlertWidget); return AlertWidget; });
方式二:服务器定时任务触发,前端接收提醒(适合后台定时触发)
如果是用Odoo的ir.cron定时任务触发,服务器端需要给目标用户发送消息,再让前端自动弹出通知:
1. 服务器端Python代码(修改你的alert方法)
from odoo import models, api class Project(models.Model): _inherit = 'project.project' @api.multi def alert(self): # 给指定用户发送消息(这里假设给当前用户,你可以改成目标用户) self.env.user.message_post( body="Hello World!!", subject="定时提醒", message_type='notification' )
2. 前端自动显示通知
Odoo默认会在用户收到新消息时,在页面右上角弹出通知,不需要额外写JS,只要服务器端发了消息,用户打开Odoo就能看到。
最后再提一句:以后遇到这类前端交互的需求,一定要区分服务器端逻辑和客户端逻辑——弹窗、页面交互这类操作都属于客户端范畴,不能用服务器端的代码去直接调用浏览器API哦。
内容的提问来源于stack exchange,提问作者Tessnim
相关产品推荐
相关产品推荐

