You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Node.js登录注册API在Postman中出现Socket Error问题排查求助

解决Socket Hangup错误及代码修复建议

我看到你作为Node.js新手在开发登录注册API时遇到了Postman请求注册接口的Socket Hangup错误,这通常是因为请求没有得到服务端响应、代码逻辑卡住导致的。结合你的代码,主要问题集中在数据库连接users.js的语法/逻辑错误上,下面逐一说明并给出修复方案:

1. MongoDB连接核心问题(app.js)

你当前用MongoClient连接数据库后立刻调用了client.close(),而且没有正确初始化mongoose的连接——你的User模型是基于mongoose构建的,但mongoose根本没和数据库建立有效连接,这会导致所有数据库操作(比如User.findOneUser.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(...),这里的userUser.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.clearCookiesres.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

火山引擎 最新活动