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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:19:45