Node.js中Postman执行GET/POST请求无响应问题排查求助
问题排查与修复方案
你的POST请求卡住无响应,主要是代码里的变量错误、响应对象被覆盖、未处理错误导致请求挂起,以下是具体问题和修复:
核心问题点
- 模型名称错误:代码中导入的模型是
myrecord,但插入数据时用了未定义的record,导致报错且未处理 - 响应对象被覆盖:
insertMany的then回调里用res作为参数,覆盖了外层的Express响应对象res,无法正确返回结果 - 未定义变量:
res.json(ress)中的ress未定义,会抛出错误 - 错误未处理:嵌套的try/catch和外层catch都没有返回错误响应,导致请求一直处于挂起状态
- 数据来源错误:上传Excel后解析得到的
data未被使用,反而用了不存在的req.body.BulkData
修复后的代码
process.env.TZ = 'Asia/Calcutta'; var port = process.env.PORT || 5000; var cCPUs = require('os').cpus().length; const cluster = require('cluster'); const express = require('express'); const reader = require('xlsx'); const path = require('path'); const app = express(); const multer = require('multer'); const mongoose = require('mongoose'); const db = require('./Config/Keys').mongoURI; const logger = require('./Config/workerlog'); const myrecord = require('./model/myrecord'); // 添加解析中间件(处理JSON和表单数据) app.use(express.json()); app.use(express.urlencoded({ extended: true })); mongoose .connect(db, { keepAlive: true, }) .then(() => logger.info('MongoDB Connected')) .catch((err) => console.log(err)); var storage = multer.diskStorage({ filename: function (req, file, cb) { var datetimestamp = Date.now(); cb( null, file.fieldname + '-' + datetimestamp + '.' + file.originalname.split('.')[file.originalname.split('.').length - 1] ); }, }); var uploads = multer({ storage: storage, fileFilter: function (req, file, callback) { const ext = file.originalname.split('.').pop().toLowerCase(); if (!['xls', 'xlsx', 'csv'].includes(ext)) { return callback(new Error('Wrong extension type')); } callback(null, true); }, }).single('file'); app.post('/Getexcelfile', async function (req, res) { uploads(req, res, async function (err) { if (err) { return res.status(400).json({ Message: 'Something went wrong...!', error: err.message }); } if (!req.file) { return res.status(400).json({ Message: 'Please choose a file' }); } try { const file = reader.readFile(req.file.path); var data = []; const sheets = file.SheetNames; for (let i = 0; i < sheets.length; i++) { const temp = reader.utils.sheet_to_json(file.Sheets[sheets[i]]); data.push(...temp); // 简化数组拼接 } // 使用解析后的data插入数据库,修改模型名为myrecord,避免覆盖res对象 const insertedData = await myrecord.insertMany(data); res.json({ path: req.file.path, insertedCount: insertedData.length, data: data }); } catch (e) { console.error('处理Excel或插入数据出错:', e); return res.status(500).json({ Message: 'Internal server error', error: e.message }); } }); }); app.get('/GetRecordDetails', async (req, res) => { try { const ResponseData = await myrecord.find(); res.json(ResponseData); } catch (err) { console.error('查询数据出错:', err); res.status(500).json({ Message: 'Failed to fetch records', error: err.message }); } }); if (cluster.isMaster) { // Create a worker for each CPU for (var i = 0; i < cCPUs; i++) { cluster.fork(); } } else { app.listen(port, () => console.log(`Listening on port ${port}`)); }
额外优化说明
- 替换了数组判断逻辑,用
includes替代indexOf,更简洁易读 - 简化了数组拼接,用
push(...temp)替代forEach循环 - 所有异步操作都添加了错误捕获,并返回对应的错误响应
- 调整了状态码:参数错误用400,服务器错误用500,更符合HTTP规范
- 添加了express解析中间件,确保能正确处理请求体
内容的提问来源于stack exchange,提问作者ASHIM
相关产品推荐
相关产品推荐

