猫鼬没有回应来自MongoDB的数据

时间:2019-05-25 06:59:24

标签: javascript node.js mongodb mongoose

我有一些代码使用了数据库:Assignment Collection: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);

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

我已经建立了MongoDB,也下载了所需的所有内容;猫鼬,nodemon,Mongodb等。

以及如何将其从节点应用程序上载到数据库集合。

1 个答案:

答案 0 :(得分:3)

您的代码中的问题与syntax有关。考虑以下代码(其中几个)

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

在此代码块中,您的Task.find将返回undefined,并且从未到达res.json。而且由于您的服务器没有发送任何响应,因此请求只是超时。

仅仅因为返回是缩进的 并不意味着它是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);
});