只要与MongoDB接口,Node / Express应用就会挂起,没有错误

时间:2018-08-05 19:54:54

标签: node.js mongodb express mongoose

我正在尝试在NodeJS,Express和Mongodb中创建CRUD REST API。

我做了一些事情来中断我的所有路线,使它们不再返回响应。没有错误,控制台中没有任何信息,等等。我不知道发生了什么,我之前曾经在工作。通过仅仅一些console.logs,我发现无论何时它与数据库交互时,它都是冻结的。

现在,当我在Postman中发送发帖请求时,它只是与“正在加载请求”一起挂起。我将请求作为正文中的原始JSON以及内容类型为application / json的形式发送;标头中的charset = UTF-8。

{"username":"zezimaUsername","rsn":"Zezima","avatar":"http://secure.runescape.com/m=avatar-rs/Zezima/chat.png"}

与Mongodb互动后,它们似乎都被吊死了。我让Mongodb使用mongod --port 27017在本地运行,并在Mongodb Compass中用两个集合(用户和帖子)创建了我的数据库。

我在db.js文件中设置了我的数据库...

var mongoose = require('mongoose');
var url = 'mongodb://localhost:27017/my-group';
mongoose.connect(url);

var db = mongoose.connection;
db.on('error', console.error.bind(console, 'MongoDB connection error: '));

module.exports = db;

然后使用server.js启动我的应用...

var express = require('express');
var api = require('./api');
var app = express();

app.use(express.json());

app.use('/api', api);

//Error handling, don't return stack trace to user, log in console.
app.use(function (err, req, res, next){
  console.log(err.stack);
  res.status(500).send('Something went wrong, internal server error.');
});

app.listen(3000, function(){
  console.log("Listening on port 3000");
});

并在我的api.js文件中定义我的路线...

var express = require('express');
var router = express.Router();
var User = require('./db/models/User');
var Post = require('./db/models/Post');

router.post('/register', function(req, res){
  var user = new User(req.body);
  user.save()
    .then(function(item){
      res.status(200).send({message: "User successfully created.", status: 200});
    })
    .catch(function(err){
      res.status(400).send({message: "User failed to save to database", status: 400});
    });
});

router.get('/user/:username', function(req, res){
  var query = User.findOne({"username": req.params.username});
  query.exec(function(err, user){
    if(user === null){
      res.status(404).send({message: "User not found", status: 404});
    }else{
    res.status(200).send(user);
    }
  });
});

router.post('/create_post', function(req, res){
  var post = new Post(req.body);
  post.save()
    .then(function(item){
      res.status(200).send({message: "Post successfully created.", status: 200});
    })
    .catch(function(err){
      console.log(err);
      res.status(400).send({message: "Post failed to save to database", status: 400});
    });
});

router.get('/post/id/:id', function(req, res){
  var query = Post.findOne({"_id":req.params.id});
  query.exec(function(err, post){
    if(post === null){
      res.status(404).send({message: 'Post not found', status: 404});
    }else{
      res.status(200).send(post);
    }
  });
});

router.get('/post/boss/:boss', function(req, res){
  var query = Post.find({"boss":req.params.boss});
  query.exec(function(err, post){
    if(post === null){
      res.status(404).send({message: 'Post not found', status: 404});
    }else{
    res.status(200).send(post);
    }
  });
});

module.exports = router;

为了完整起见...我的模型看起来像...

User.js

var mongoose = require('mongoose');
var Schema = mongoose.Schema;

var userSchema = new Schema({
  username:{
    type: String,
    required: true
  },
  rsn:{
    type: String,
    required: true
  },
  avatar:{
    type: String,
    required: true
  },
  posts:[{
    type: Schema.Types.ObjectId,
    ref: 'posts'
  }]
});

var user = mongoose.model('users', userSchema);
module.exports = user;

和Post.js

var mongoose = require('mongoose');
var shortid = require('shortid');
var Schema = mongoose.Schema;

var postSchema = new Schema({
  _id:{
    type: String,
    default: shortid.generate
  },
  username:{
    type: Schema.Types.ObjectId,
    ref: 'users'
  },
  rsn:{
    type: String,
    required: true
  },
  avatar:{
    type: String,
    required: true
  },
  boss:{
    type: String,
    required: true
  }
});

var post = mongoose.model('posts', postSchema);
module.exports = post;

我不确定发生了什么,我一直在阅读大量的各种教程和文档,但是我只是看不到我遇到的问题。

1 个答案:

答案 0 :(得分:1)

您不需要db.js文件中的server.js文件。

var express = require('express');之后输入它

let db = require("./db");

然后它将正常工作。