Node.js+MongoDB开发ESN新增POST API遇500内部服务器错误
500 Internal Server Error 当尝试通过POST API存储ESN数据到MongoDB时
我正在开发一个简单的POST API,用于将ESN数据存入MongoDB,技术栈为Node.js。已编写Esn模型、创建ESN的控制器、路由文件及项目入口index.js,但调用接口时出现500 Internal Server Error,无法完成数据存储。
现有代码
模型代码(models/esn.js)
const mongoose = require("mongoose"); const Schema = mongoose.Schema; const esnSchema = new Schema({ esnName: { type: String, required: true, }, esnEmail: { type: String, required: true, }, esnLogo: { data: Buffer, contentType: String, required: false, } }) module.exports = mongoose.model("Esn",esnSchema);
控制器代码(controllers/esn.js)
const Esn = require('../models/esn'); // create new ESN const createEsn = async (req, res) => { if (!req.body.esnName) { res.status(400).send({ message: "Content can not be empty!" }); return; } const esn = new Esn({ esnName: req.body.esnName, esnEmail: req.body.esnEmail, esnLogo: req.body.esnLogo }); // Save Esn in the database esn .save(esn) .then(data => { res.send(data); }) .catch(err => { res.status(500).send({ message: err.message || "Some error occurred while creating the esn" }); }); }; module.exports = { createEsn };
路由代码(routes/esn.js,当前存在错误)
const mongoose = require("mongoose"); const Schema = mongoose.Schema; const esnSchema = new Schema({ esnName: { type: String, required: true, }, esnEmail: { type: String, required: true, }, esnLogo: { data: Buffer, contentType: String, required: false, } }) module.exports = mongoose.model("Esn",esnSchema);
入口文件(index.js)
const express = require('express'), cors = require('cors'), swaggerUi = require('swagger-ui-express'), swaggerDocument = require('./docs/swagger.json'); const Mongo = require('mongodb'); const { default: mongoose } = require('mongoose'); const mainRoutes = require('./routes/esn') const app = express(); var url = "mongodb://127.0.0.1:27017/"; var databasename = "skills"; Mongo.MongoClient.connect(url).then((client) => { console.log('Database connected'); const connect = client.db(databasename); //const collection = connect.createCollection("esn"); console.log('Database: ', connect); }).catch((err) => { // Handling the error console.log(err.Message); }) app.use(cors()); app.use(express.json()); app.listen(3000, () => { console.log('Listening on port 3000!'); }); app.get('/', (req, res) => { res.send('Hello World'); }); app.use('/api/', mainRoutes); app.use('/api-docs', swaggerUi.serve, swaggerUi.setup(swaggerDocument));
问题排查与修正方案
1. 数据库连接方式错误
当前index.js同时混用了原生MongoDB驱动和Mongoose,但控制器使用的是Mongoose模型,而Mongoose并未完成数据库连接。需改用Mongoose统一连接:
修正后的index.js数据库连接部分:
// 替换原MongoClient连接代码 mongoose.connect(`${url}${databasename}`) .then(() => console.log('Mongoose数据库连接成功')) .catch(err => console.error('数据库连接失败:', err.message));
2. 路由文件内容错误
你提供的路由代码重复了模型定义,实际路由文件应负责绑定请求路径与控制器方法:
修正后的routes/esn.js:
const express = require('express'); const router = express.Router(); const esnController = require('../controllers/esn'); // 绑定POST请求到控制器方法 router.post('/esn', esnController.createEsn); module.exports = router;
3. Mongoose save方法调用错误
控制器中esn.save(esn)是错误用法,Mongoose文档的save方法无需传入参数:
修正控制器中的save调用:
esn.save() .then(data => { res.send(data); }) .catch(err => { res.status(500).send({ message: err.message || "Some error occurred while creating the esn" }); });
4. 补充必填字段校验
模型中esnEmail为必填项,但控制器未校验,需补充:
if (!req.body.esnEmail) { return res.status(400).send({ message: "esnEmail is required!" }); }
5. 错误信息拼写错误
index.js中err.Message应改为err.message(小写m),否则无法正确打印错误详情。
内容的提问来源于stack exchange,提问作者Fawzy OTHMAN
相关产品推荐
相关产品推荐

