首页 > 解决方案 > Mongoose 没有响应来自 MongoDB 的数据

问题描述

我有一些代码使用数据库中的一些数据:AssignmentCollection: todolist,它应该与 MongoDB 交互并添加、删除或列出集合中的 JSON。

为了理解这个问题,我必须在解释之前展示代码。

这是模型的代码:

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

var TaskSchema = new Schema({
  id: {
    type: String,
    unique: true
  },
  desc: {
    type: String
  }
});

module.exports = mongoose.model('Task', TaskSchema);

这是控制器的代码:

'use strict';

var mongoose = require('mongoose'),

Task = mongoose.model('Task');

exports.list_all_tasks = function(req, res) {

  console.log("listing should commence");

  Task.find({}, function(err, task) {
    if (err)
      res.send(err);
      return;
    res.json(task);
  });

};

exports.create_a_task = function(req, res) {

  var new_task = new Task(req.body);
  new_task.save(function(err, task) {
    if (err)
      res.send(err);
      return;
    res.json(task);
  });

};

exports.delete_a_task = function(req, res) {

  Task.deleteOne({
    _id: req.params.taskId
  }, function(err, task) {
    if (err)
      res.send(err);
      return;
    res.json({n: task.n, ok: task.ok});

  });

};

这是路线的代码:

'use strict';
module.exports = function(app) {
  var todoList = require('./controller');

  // todoList Routes
  app.route('/tasks')

    .get(todoList.list_all_tasks)
    
    .post(todoList.create_a_task);

  app.route('/tasks/:taskId')

    .delete(todoList.delete_a_task);

};

Server.js 文件:

const express = require('express');
const app = express();
const port = 3000;

var mongoose = require('mongoose');
Task = require('./api/model'); //created model loading here
bodyParser = require('body-parser');
mongoose.Promise = global.Promise;

const controller = require('./api/controller');

// mongoose instance connection url connection

//P.S The username and password have been taken off this security and privacy reasons
mongoose.connect('mongodb+srv://userName:password@server-4tjvi.mongodb.net/Assignment?retryWrites=true', { useNewUrlParser: true });

app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());

var routes = require('./api/routes'); //importing route
routes(app); //register the route


app.listen(port);

console.log('Welcome to Just Do It, your Node.js application for all your To Do List needs.');
console.log('todo list API server has started on: port ' + port);

好的,我遇到的问题是,当我在 Postman 中输入 localhost:3000/tasks 时,它说它正在加载很长时间,然后它说它无法得到响应。我想要它做的是将集合中的所有任务(JSON)列出到邮递员上。

我已经设置了 MongoDB,我也下载了所有需要的东西;猫鼬、nodemon、Mongodb 等。

以及如何将我的节点应用程序中的内容上传到数据库集合。

标签: javascriptnode.jsmongodbmongoose

解决方案


您的代码中的问题在于syntax. 考虑以下代码(其中几个)

Task.find({}, function(err, task) {
  if (err)
    res.send(err);
    return;
  res.json(task);
});

在这段代码中,您Task.find将返回undefined并且res.json永远不会到达。而且由于您的服务器没有发送任何响应,因此请求将超时。

仅仅因为 return 是缩进的并不意味着它是if块的一部分。要使其成为if块的一部分,您必须将其放入braces {}

这是一个插图:

function test() {
  let out;
  if (true)
    out === 'yes';
    return; // <-- not part of if block
  console.log('never reached')
  return out; // <-- never reached
}

console.log(test())

以上等价于:

function test(x) {
  let out;
  if (true)
    out === 'yes';
  return; // return undefined
}

console.log(test())

所以重构它:

Task.find({}, function(err, task) {
  if (err) {
    res.send(err);
    return;
  }
  res.json(task);
});

或者return res.send

Task.find({}, function(err, task) {
  if (err)
    return res.send(err);
  res.json(task);
});

推荐阅读