Node.js登录注册API在Postman中出现Socket Error问题排查求助
我看到你作为Node.js新手在开发登录注册API时遇到了Postman请求注册接口的Socket Hangup错误,这通常是因为请求没有得到服务端响应、代码逻辑卡住导致的。结合你的代码,主要问题集中在数据库连接和users.js的语法/逻辑错误上,下面逐一说明并给出修复方案:
1. MongoDB连接核心问题(app.js)
你当前用MongoClient连接数据库后立刻调用了client.close(),而且没有正确初始化mongoose的连接——你的User模型是基于mongoose构建的,但mongoose根本没和数据库建立有效连接,这会导致所有数据库操作(比如User.findOne、User.create)一直处于等待状态,最终请求超时触发Socket Hangup。
修复方法:
移除MongoClient的连接代码,改用mongoose统一管理数据库连接,这样所有mongoose模型都能正常工作。在app.js里替换原MongoClient代码为:
// 替换原来的MongoClient连接部分 const uri = "mongodb+srv://Sauravpandey:85ffxufexfEP3HXzPPq@saurav-5irg5.mongodb.net/test?retryWrites=true&w=majority"; mongoose.connect(uri, { useNewUrlParser: true, useUnifiedTopology: true }) .then(() => console.log('Connected properly to MongoDB via Mongoose')) .catch(err => console.error('MongoDB connection error:', err));
2. users.js的语法与逻辑错误修复
(1)缺少express依赖引入
你的router = express.Router()之前没有引入express,会导致express未定义的错误,添加:
const express = require('express');
(2)注册接口创建用户的对象错误
signup接口里你写的是return user.create(...),这里的user是User.findOne返回的结果(可能是null或用户对象),正确的应该用mongoose模型User.create:
return User.create({ username: req.body.username, password: req.body.password });
(3)登出接口的路径与方法错误
- 路由路径写错:
router.get('./logout'应该改为router.get('/logout' - 清除cookie方法名错误:
res.clearCookies是res.clearCookie(单数),且cookie名要和session配置一致:'session-id' - 补充错误处理的
next调用
修复后的logout代码:
router.get('/logout', (req, res, next) => { if (req.session) { req.session.destroy(); res.clearCookie('session-id'); res.redirect('/'); } else { var err = new Error('You are not logged in!'); err.status = 403; next(err); } });
(4)注册接口错误处理的语法歧义
你在.then(user=>{...}), (err)=>next(err)里的逗号是错误的,建议统一用.catch处理错误,避免语法歧义:
router.post('/signup',(req,res,next)=>{ User.findOne({username:req.body.username}) .then((user)=>{ if(user!=null){ var err=new Error('User '+ req.body.username +' already exists'); err.status=403; throw err; // 抛出错误交给catch处理 } else{ return User.create({ username:req.body.username, password:req.body.password }); } }) .then(user=>{ res.statusCode=200; res.setHeader('Content-Type','application/json'); res.json({status:'Registration successful',user: user}); }) .catch((err)=>next(err)); });
3. app.js的中间件顺序优化(可选)
建议取消cookieParser的注释,放在session配置之前,因为express-session依赖cookie解析:
app.use(cookieParser('12345-67890-09876-54321')); // 取消注释 app.use(session({ name:'session-id', secret:'12345-67890-09876-54321', saveUninitialized:false, resave:false, store:new FileStore() }))
测试前的额外确认
确保你的User模型(../Model/user.js)定义正确,示例如下:
const mongoose = require('mongoose'); const Schema = mongoose.Schema; const userSchema = new Schema({ username: { type: String, required: true, unique: true }, password: { type: String, required: true } }); module.exports = mongoose.model('User', userSchema);
完成以上修改后,启动服务,用Postman发送POST请求到http://localhost:3000/users/signup,Body选择raw-JSON格式,传入{"username":"test","password":"123456"},应该能得到正常的注册成功响应。
内容的提问来源于stack exchange,提问作者SauravPandey




