【问题标题】:Node.js Mongoose model not saving without errorNode.js Mongoose 模型没有正确保存
【发布时间】:2017-01-24 17:40:45
【问题描述】:

制作这个简单的 Node.js Express API 我遇到了一个奇怪的问题: 我正在创建一个模型并将数据插入其中,然后将其保存到我的 MongoDB 中。但是记录从未保存过,但我也没有收到任何错误。我检查了 MongoDB 是否正在运行,节点错误的 syslog 和 MongoDB 错误的 mongod.log 以及我自己的 Wilson debug.log 文件。都没有错误。

我使用邮递员来测试 API 并且每次都会得到响应。只是数据没有保存到 MongoDB(我使用带有 db.collection.find() 的 mongo 控制台来检查插入的记录)。

知道为什么会发生这种情况吗?

我的代码:

api.js

var express    = require('express');
var app        = express();
var bodyParser = require('body-parser');
var http       = require('http');
var https      = require('https');
var fs         = require('fs');
var winston    = require('winston');

// Configure logging using Winston
winston.add(winston.transports.File, { filename: '/home/app/api/debug.log' });
winston.level = 'debug';

// Request body parser
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());

// Enable https 
var privateKey  = fs.readFileSync('path to private key');
var certificate = fs.readFileSync('path to cert file');

var credentials = {
    key: privateKey,
    cert: certificate
};

// ROUTERS
var router = express.Router();

var speciesRouter = require('./app/routes/speciesRouter');
router.use('/species', speciesRouter);

// Routes prefix
app.use('/api/v1', router);

// SERVER STARTUP
http.createServer(app).listen(3000);
https.createServer(credentials, app).listen(3001);

speciesRouter.js

var express  = require('express');
var mongoose = require('mongoose');
var router   = express.Router();
var Sighting = require('../models/sighting');
var winston  = require('winston');

// Database connection
var dbName = 'dbname';
mongoose.connect('mongodb://localhost:27017/' + dbName);
var db = mongoose.connection;
db.on('error', function(err){
  winston.log('debug', err);
});

router.route('/')

.post(function(req, res) {

  var sighting = new Sighting();
  sighting.user_key = req.body.user_key;
  sighting.expertise = req.body.expertise;
  sighting.phone_location = req.body.phone_location;
  sighting.record_time = req.body.record_time;
  sighting.audio_file_location = '/var/data/tjirp1244123.wav';
  sighting.probable_species = [{species_name:'Bosaap', percentage:100}];

  var error = '';
  winston.log('debug', 'test');

  // This does not get execute I suspect..
  sighting.save(function(err) {
    winston.log('debug', 'save');
    if (err) {
      winston.log('debug', err);
      error = err;
    }
  });

  res.json({ 
    probable_species: probable_species,
    expertise: req.body.expertise,
    error: error
  });
});

module.exports = router;

sighting.js(模型)

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

var SightingSchema = new Schema({
  user_key: String,
  expertise: Number,
  phone_location: { lat: Number, lng: Number },
  record_time: Number,
  audio_file_location: String,
  probable_species: [{ species_name: String, percentage: Number }]
});

module.exports = mongoose.model('Sighting', SightingSchema);

【问题讨论】:

  • winston.log('debug', 'save');这打印了什么?
  • 这会将它放在我的自定义日志文件中,是的。这条线永远不会到达,但是在Sighting.save()线之前放置另一个winston日志确实到达。
  • 我检查了 db.calculations.find() 和 db.sightings.count()。第一个为空,第二个返回 0。
  • 您的代码正在保存到dbname 数据库中,这是您要查找的地方吗?
  • 是的,我检查了:)

标签: node.js mongodb express mongoose


【解决方案1】:

您是否尝试过更新您的 mongodb。

sudo npm update

【讨论】:

  • 这行得通,我在 package.json 中将 mongoose 的版本号更改为最新,然后运行 ​​sudo npm update
【解决方案2】:

你可以尝试使用promise。

return sighting.save().then(function(data){
   console.log(data); // check if this executes
   return res.json({ 
      probable_species: probable_species,
    expertise: req.body.expertise,
    error: error
    });
}).catch(function(err){
   console.log(err);
});

还有一点不要在 save 函数之外使用 res.json,因为在异步代码中它会在不等待 save 函数完成执行的情况下运行

【讨论】:

  • 这给了我 TypeError: Cannot read property 'then' of undefined,所以现在我正在调查我实例化的模型中的内容。 Ty 获取有关 res.json 的提示!
  • sighting 确实包含正确的模型,所以我不知道为什么它会抛出我上面提到的类型错误。
  • 在sighting.save()之前尝试不返回的情况
  • Same TypeError,这个很难破解!
  • 找不到更多。因为我无法调试它
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-07-12
  • 2013-11-23
  • 2018-05-31
  • 1970-01-01
  • 2019-03-14
  • 1970-01-01
  • 2015-11-13
相关资源
最近更新 更多