OracleDB中出现TypeError: Schema is not a constructor错误的问题排查求助
TypeError: Schema is not a constructor 问题解决方案
嘿,作为JavaScript新手遇到这个问题太正常啦——你踩了一个「数据库工具API混淆」的坑,咱们一步步拆解解决:
核心问题:你混用了两个完全不同的数据库工具
你写的代码是Mongoose(MongoDB的ODM框架)的语法,但你却导入了oracledb(Oracle数据库的驱动)。而oracledb本身根本没有Schema和model这些API,所以才会抛出TypeError: Schema is not a constructor的错误,路由文件里的报错也是因为模型文件导出的对象不对导致的。
接下来分两种情况给你解决:
情况1:你确实要连接Oracle数据库
OracleDB的操作逻辑和Mongoose完全不同,它没有Schema/Model的概念,需要直接通过SQL语句操作数据。给你修改代码示例:
模型文件(models/Meals.js)
const oracledb = require('oracledb'); // 先配置你的Oracle数据库连接信息 const dbConfig = { user: '你的Oracle用户名', password: '你的Oracle密码', connectString: 'localhost:1521/你的数据库实例名' // 比如ORCL }; // 封装Meals表的操作方法 const Meals = { // 查询所有餐品 find: async () => { let connection; try { connection = await oracledb.getConnection(dbConfig); const result = await connection.execute('SELECT * FROM MEALS'); return result.rows; } catch (err) { throw new Error(`查询失败: ${err.message}`); } finally { // 一定要关闭连接 if (connection) await connection.close(); } }, // 根据ID查询单个餐品 findById: async (id) => { let connection; try { connection = await oracledb.getConnection(dbConfig); const result = await connection.execute( 'SELECT * FROM MEALS WHERE ID = :id', [id], { outFormat: oracledb.OUT_FORMAT_OBJECT } // 返回对象格式的数据 ); return result.rows[0]; } catch (err) { throw new Error(`查询ID为${id}的餐品失败: ${err.message}`); } finally { if (connection) await connection.close(); } }, // 创建餐品 create: async (mealData) => { let connection; try { connection = await oracledb.getConnection(dbConfig); const result = await connection.execute( 'INSERT INTO MEALS (NAME, DESC) VALUES (:name, :desc)', [mealData.name, mealData.desc], { autoCommit: true } ); return { id: result.lastRowid, ...mealData }; } catch (err) { throw new Error(`创建餐品失败: ${err.message}`); } finally { if (connection) await connection.close(); } } }; module.exports = Meals;
路由文件(routes/meals.js)
因为OracleDB的操作是异步的,路由需要改成async/await配合try/catch处理错误:
const express = require('express') const Meals = require('../models/Meals') const router = express.Router() router.get('/', async (req, res) =>{ try { const meals = await Meals.find() res.status(200).send(meals) } catch (err) { res.status(500).send(err.message) } }) router.get('/:id', async (req, res) => { try { const meal = await Meals.findById(req.params.id) res.status(200).send(meal) } catch (err) { res.status(500).send(err.message) } }) router.post('/', async (req, res) => { try { const newMeal = await Meals.create(req.body) res.status(201).send(newMeal) } catch (err) { res.status(500).send(err.message) } }) // PUT和DELETE方法可以参考上面的写法自行修改 module.exports = router
情况2:你其实想用MongoDB(只是误装了oracledb)
如果你的目标是MongoDB,那只需要切换到Mongoose即可:
- 首先安装Mongoose:
npm install mongoose
- 修改模型文件(
models/Meals.js):
const mongoose = require('mongoose') const Schema = mongoose.Schema // 这里用mongoose的Schema,不是oracledb! // 定义Schema const mealSchema = new Schema({ name: String, desc: String, }) // 创建Model并导出 const Meals = mongoose.model('Meal', mealSchema) module.exports = Meals
- 在项目主文件(比如
app.js)中添加MongoDB连接:
const mongoose = require('mongoose') // 连接本地MongoDB,替换成你的数据库名 mongoose.connect('mongodb://localhost:27017/mealDB') .then(() => console.log('MongoDB连接成功!')) .catch(err => console.error('MongoDB连接失败:', err))
这样你的路由文件就可以保持原来的写法不变,因为Mongoose的Model确实提供了find、findById、create这些方法。
内容的提问来源于stack exchange,提问作者Luis Jarold Guevara Castro
相关产品推荐
相关产品推荐

