如何在Node.js+NLP.js直连连接器中实现机器人定时发消息
解决nlp.js机器人延迟发送多轮消息的问题
问题场景
基于nlp.js开发聊天机器人,需要实现:用户发送“Work?”后,机器人先回复“Yes”,间隔2秒再回复“work”。之前尝试在代码中直接使用setTimeout导致实现失败甚至代码崩溃。
解决方案代码
针对quickstart/08.Webchat目录下的index.js,修改为以下代码,在消息发送环节处理延迟逻辑,避免干扰nlp.js内部流程:
const { dockStart } = require('@nlpjs/basic'); const express = require('express'); const http = require('http'); const socketIO = require('socket.io'); const app = express(); const server = http.createServer(app); const io = socketIO(server); app.use(express.static(__dirname + '/public')); (async () => { const dock = await dockStart({ use: ['Basic']}); const nlp = dock.get('nlp'); nlp.addLanguage('en'); // 添加现有问候意图 nlp.addDocument('en', 'Jack', 'greetings.jack'); nlp.addAnswer('en', 'greetings.jack', 'Hi, Jack'); // 添加Work?对应的意图和回复 nlp.addDocument('en', 'Work?', 'work.ask'); nlp.addAnswer('en', 'work.ask', 'Yes'); nlp.addAnswer('en', 'work.ask', 'work'); await nlp.train(); // 处理socket聊天消息 io.on('connection', (socket) => { socket.on('message', async (msg) => { const response = await nlp.process('en', msg); if (response.intent === 'work.ask') { // 先发送第一个回复 socket.emit('response', response.answers[0].answer); // 延迟2秒发送第二个回复 setTimeout(() => { socket.emit('response', response.answers[1].answer); }, 2000); } else { // 其他意图直接发送回复 socket.emit('response', response.answers[0].answer); } }); }); server.listen(3000, () => { console.log('Server running on http://localhost:3000'); }); })();
关键说明
- 避免在nlp.js内部流程中使用异步延迟:之前的崩溃大概率是因为在
addAnswer或nlp处理的同步流程中插入setTimeout,干扰了nlp.js的内部逻辑。正确的做法是在nlp完成意图识别和回复生成后,在消息发送环节处理延迟。 - 分开发送多轮回复:针对特定意图(如
work.ask),先发送第一个回复,再通过setTimeout延迟发送第二个回复,确保异步操作不会影响nlp的核心流程。 - 适配Webchat场景:结合socket.io实现前端与后端的消息通信,这是08.Webchat示例的标准通信方式,确保延迟回复能正确推送到前端聊天界面。
内容的提问来源于stack exchange,提问作者Reg
相关产品推荐
相关产品推荐

