在代码中使用 json 序列化和反序列化数据,而不是使用 Bull 队列来传递数据和函数。
示例代码:
1.生产者
const Bull = require('bull');
const queue = new Bull('jobQueue');
const jobData = {
name: 'Lucy',
age: 20,
sayHi: function() {
console.log('Hello!');
}
};
queue.add(jobData);
2.消费者
const Bull = require('bull');
const queue = new Bull('jobQueue');
queue.process(async function(job) {
const jobData = JSON.parse(job.data);
console.log(`name: ${jobData.name}, age: ${jobData.age}`);
jobData.sayHi(); // 报错:jobData.sayHi is not a function
});
修改后的消费者代码:
const Bull = require('bull');
const queue = new Bull('jobQueue');
queue.process(async function(job) {
const jobData = JSON.parse(job.data);
console.log(`name: ${jobData.name}, age: ${jobData.age}`);
const sayHi = eval('(' + jobData.sayHi + ')'); // 将 sayHi 函数字符串转换为函数
sayHi(); // 输出:Hello!
});
在生产者代码中,将任务数据直接添加到队列中,不需要改动。
在消费者代码中,使用 JSON.parse 将从队列中取出的任务数据转换为对象,然后使用 eval 将任务数据中的函数字符串转换为实际的函数对象,从而能够正确的调用函数。
需要注意的是,使用 eval 函数存在一定的安全性问题,建议使用更加安全的技术来实现类似的功能,如将函数通过 HTTP 接口传递等方式。