尝试基于猫鼬模式的findOne()方法的结果呈现模板

时间:2019-04-15 06:04:30

标签: node.js mongodb express mongoose

我正在尝试使用在mongoDB中生成的任务ID呈现一个模板,该模板将任务ID作为输入。我是Node和mongoDB的新手,因此对任何错误的术语深表歉意。尽管任务ID填充在url中,但下面的findOne方法在其回调函数中为data参数返回null。

我尝试过使用exec()并链接then(),但是该实现不会导致数据被填充。另外,MongoDB版本是3.4。

var express = require('express');
var router = express.Router();

router.get('/createTask', function(req, res) {
  var newTask = new Task();

  newTask.save(function( err, data) {
    if (err) {
      console.log(err);
      res.render('error');
    } else {
      res.redirect('/task/' + data._id);
    }
  })
});

router.get('/task/:id', function(req, res) {
  if (req.params.id) {
    Task.findOne({_id: req.params.id}, function(err, data) {
      if (err) {
        console.log(err);
        res.render('error');
      }

      if (data) {
        res.render('task', {data: data});
      } else {
        res.render('error');
      }
    })
  } else {
    res.render('error');
  }
});

module.exports = router;

这应该使用添加的简单h1呈现任务模板以进行测试,但会返回空白页面。

1 个答案:

答案 0 :(得分:0)

我的猜测是_id是一个ObjectID类型字段,这意味着您无法执行task.findOne({ _id: req.params.id })并无法在回调函数的data参数中获取文档。

在task.findOne()中使用oId变量代替req.params.id

const mongo = require('mongodb');
const oId = new mongo.ObjectID(req.params.id);