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
相关产品推荐
相关产品推荐

