Hapi.js中无法从Lib函数调用Service存储MongoDB短信日志问题求助
嘿,我来帮你搞定这个Hapi.js里调用Service存短信日志的问题!你说已经在Notification相关文件里引入了Service和Model,但Lib下的NotificationManager.js还是调用不了,大概率是这几个地方出了问题,咱们一步步排查:
1. 先检查模块引入的路径是否正确
因为Lib目录和Service目录的层级可能不一样,比如你的Service在src/services/,而NotificationManager.js在src/lib/,那引入的时候得用相对路径,比如:
// 正确的相对路径示例,根据你的项目结构调整 const MessageLogsService = require('../services/MessageLogsService');
你可以在引入后加个console.log(MessageLogsService),如果输出是undefined,那肯定是路径写错了,得核对下文件夹的层级关系。
2. 确认Service的导出方式是否匹配
打开你的MessageLogsService.js,看看导出方式是不是和你的引入方式匹配:
如果你用CommonJS(Node.js默认)导出:
module.exports = { addMessageLogsinsert: function(data, callback) { // 你的MongoDB插入逻辑 } };
那引入的时候就用require:
const { addMessageLogsinsert } = require('../services/MessageLogsService'); // 或者直接引入整个Service对象 const MessageLogsService = require('../services/MessageLogsService');
如果用ES6模块导出:
export const addMessageLogsinsert = (data, callback) => { // 你的逻辑 };
那要么在package.json里加上"type": "module"启用ES模块,要么用import引入:
import { addMessageLogsinsert } from '../services/MessageLogsService';
3. 排查Hapi服务的初始化顺序
如果你的Service依赖MongoDB连接或者Hapi的server实例,那可能在NotificationManager.js调用的时候,数据库还没连上,或者Service还没初始化好。这时候可以把NotificationManager的逻辑放到Hapi启动完成之后:
// 你的Hapi启动文件 const Hapi = require('@hapi/hapi'); const server = Hapi.server({ port: 3000, host: 'localhost' }); async function initServer() { // 先注册插件、初始化数据库连接 await server.register(/* 你的插件 */); await require('./models').connectMongoDB(); // 假设这是你的数据库连接方法 // 启动服务 await server.start(); console.log('Server running on', server.info.uri); // 现在再初始化NotificationManager,确保Service已经就绪 require('./lib/NotificationManager').init(); } initServer().catch(err => { console.error('Server init failed:', err); process.exit(1); });
4. 加上错误日志,明确问题所在
你当前的代码里没有处理回调的错误,建议先加上错误打印,这样能立刻知道到底是找不到Service方法,还是数据库报错:
// 调整后的日志保存代码 const dataToSet = { triggeredFrom : "XXX", triggeredTo : "XXX", message : smsOptions.Body, messageType : type, messageFor: "XXX", variables : variableDetails, response : res, }; MessageLogsService.addMessageLogsinsert(dataToSet, function (err, data) { if (err) { console.error('SMS日志保存失败:', err); // 这里可以加重试或者告警逻辑 return; } console.log('SMS日志保存成功:', data); });
内容的提问来源于stack exchange,提问作者Jitendra
相关产品推荐
相关产品推荐

