使用node-schedule遇TypeError: job.start is not a function错误求助
解决TypeError: job.start is not a function及代码中的其他问题
核心错误修复
- 移除
job.start()调用:在node-schedule库中,调用schedule.scheduleJob()时,任务会自动启动,返回的Job对象并不包含start()方法,这就是触发TypeError的直接原因。直接删除job.start()这一行即可解决该报错。
代码中其他关键问题及修正建议
除了上述报错,你的代码还存在几个会导致任务无法正常运行的问题:
whois模块使用错误:你调用的whois.getRegisteredDomains()方法不存在,该模块仅用于查询单个域名的WHOIS信息,无法直接获取每日新注册域名列表。要获取新注册域名,你需要使用域名注册局的官方API(如Verisign的New gTLD数据接口)或第三方合规数据源。- Node.js环境无
pandas库:pandas是Python专属的数据处理库,Node.js无法直接使用。可以替换为csv-writer、fast-csv等Node.js原生CSV处理工具。 smtp模块使用不当:原生smtp模块配置复杂,推荐使用成熟的nodemailer库来处理邮件发送,它封装了SMTP的底层逻辑,使用更简洁。- 日期过滤逻辑有误:
new Date()生成的是当前精确时间,你需要筛选今日注册的域名,应将日期范围设置为今日0点至当前时间,否则只会匹配注册时间晚于当前时刻的域名。
修正后的代码示例
首先安装所需依赖:
npm install node-schedule whois nodemailer csv-writer
替换后的完整代码:
import schedule from 'node-schedule'; import whois from 'whois'; import createCsvWriter from 'csv-writer'; import nodemailer from 'nodemailer'; // 示例:获取新注册域名(实际需替换为官方API或合规数据源) async function getNewRegisteredDomains() { // 这里仅用模拟数据演示,实际需替换为真实获取逻辑 const sampleDomains = ['example-new-domain.com', 'test-new-domain.org']; const domainRecords = []; for (const domain of sampleDomains) { try { const data = await new Promise((resolve, reject) => { whois.lookup(domain, (err, data) => { if (err) reject(err); else resolve(data); }); }); // 解析WHOIS数据(不同域名后缀格式不同,需按需适配) domainRecords.push({ name: data.registrant?.name || 'N/A', domain: domain, email: data.registrant?.email || 'N/A', phone: data.registrant?.phone || 'N/A', registeredDate: data.created || 'N/A' }); } catch (err) { console.error(`查询域名${domain}失败:`, err); } } // 筛选今日注册的域名 const today = new Date(); today.setHours(0, 0, 0, 0); return domainRecords.filter(record => { if (!record.registeredDate) return false; const regDate = new Date(record.registeredDate); return regDate >= today; }); } // 配置邮件发送器(Gmail需使用应用专用密码) const transporter = nodemailer.createTransport({ service: 'gmail', auth: { user: 'mpainkra7@gmail.com', pass: 'your-app-specific-password' } }); // 定时任务:每天10点执行 const job = schedule.scheduleJob('0 10 * * *', async () => { try { const filteredDomains = await getNewRegisteredDomains(); if (filteredDomains.length === 0) { console.log('今日无新注册域名'); return; } // 生成CSV文件 const csvWriter = createCsvWriter.createObjectCsvWriter({ path: 'domains.csv', header: [ { id: 'name', title: '名称' }, { id: 'domain', title: '域名' }, { id: 'email', title: '邮箱ID' }, { id: 'phone', title: '电话号码' }, { id: 'registeredDate', title: '注册日期' } ] }); await csvWriter.writeRecords(filteredDomains); console.log('CSV文件已生成'); // 发送带附件的邮件 const mailOptions = { from: 'mpainkra7@gmail.com', to: 'tuktukpainkra7@gmail.com', subject: '每日新注册域名WHOIS记录', text: `今日共发现${filteredDomains.length}个新注册域名,详情请查看附件。`, attachments: [{ filename: 'domains.csv', path: './domains.csv' }] }; await transporter.sendMail(mailOptions); console.log('邮件发送成功'); } catch (err) { console.error('任务执行失败:', err); } }); console.log('定时任务已启动,每天10点执行');
内容的提问来源于stack exchange,提问作者Mayank Painkra
相关产品推荐
相关产品推荐

