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

Node.js运行报错Type Error: findByID is not a function问题咨询

错误产生原因

  • 核心原因是模块的导出导入逻辑错误:/model/anbieter.js中的findById方法没有挂载到可导出的Anbieter对象上,也没有做模块导出;同时/controller/anbieter.js中没有引入model层的模块,直接调用Anbieter.findById时,Anbieter变量不是预期的包含目标方法的对象,因此抛出方法不存在的错误。
  • 额外隐藏问题:db.query是异步操作,原有同步写法即使方法存在也无法拿到正确的返回结果,且直接拼接SQL字符串存在SQL注入风险。

修复方案

1. 修正model层代码,正确封装并导出Anbieter对象

/model/anbieter.js调整为如下内容:

// 替换为你项目中实际的数据库实例引入路径
const db = require('./db');

const Anbieter = {
  findById(id) {
    // 用Promise封装异步查询,方便上层用async/await调用
    return new Promise((resolve, reject) => {
      // 改用参数化查询,避免SQL注入风险
      const sql = `SELECT * FROM Anbieter WHERE Anbieter_id = ?`;
      db.query(sql, [id], (err, result) => {
        if (err) return reject(err);
        // 单条查询返回结果数组的第一个元素
        resolve(result?.[0]);
      });
    });
  }
};

// 导出Anbieter对象供其他模块调用
module.exports = Anbieter;

2. 修正controller层代码,正确引入模块并处理异步逻辑

/controller/anbieter.js调整为如下内容:

// 按你项目实际相对路径引入model层的Anbieter对象
const Anbieter = require('../model/anbieter');

async function getAnbieterById(req, res) {
  try {
    const userid = parseInt(req.params.id);
    // 等待异步查询返回结果
    const anbieter = await Anbieter.findById(userid);
    res.send(anbieter);
  } catch (err) {
    res.status(500).send({ error: '查询供应商信息失败', detail: err.message });
  }
};

// 如果需要将该方法挂载到路由,新增导出语句
module.exports = { getAnbieterById };

内容的提问来源于stack exchange,提问作者Feyza Keles

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 10:18:00