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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:03:42