【问题标题】:Mongodb/mongoose only saving once then creating 500 errorMongodb/mongoose 只保存一次然后创建 500 错误
【发布时间】:2018-02-10 06:34:28
【问题描述】:

我将 json 发送到我的 node.js/express 应用程序,它接收发送的数据 做我想做的事,但只做一次。

在我启动 appjs 后第一次收到 200 个请求并将数据保存到我的 mongodb。我可以在数据库和控制台日志中看到数据。但在随后的任何 POST 中,我都会得到 500。

这是该路线的代码

var express = require('express');
var phone = require('../models/phonedata-api');
var router = express.Router();
var bodyParser = require('body-parser');
router.use(bodyParser.json()); // support json encoded bodies
router.use(bodyParser.urlencoded({ extended: true })); // support encoded bodies

router.post('/api/phone-data', function(req, res) {

	phone = new phone();
	phone.loc = req.body.loc;
	phone.battery = req.body.battery;
	phone.signal = req.body.signal;
	phone.phonedate = req.body.phonedate;
	phone.day_of_month = req.body.dom;
	phone.save(function(err) {
	if(err) 
		res.send(err); 
		})

    res.send('Phone data recived successfully');
    console.log(req.body);
});

module.exports = router;

还有我的数据库模型/模式。

// /models/phonedata-api.js

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

var phoneSchema = new Schema({
		loc: String,
		battery:    String,
		signal: String,
		phonedate: String,
		day_of_month: String,
		date: { type: Date, default: Date.now },
});

var phone = mongoose.model('phone', phoneSchema);

module.exports = phone;
{ "battery": "72",
  "signal": "-12",
  "phonedate": "09-08-2015",
  "dom": "9",
  "loc": "52.05351615,1.12653186" }

我的控制台日志是。

> pukkapi@1.2.0 start /home/pi/Dev_work/pukkapi
> node ./bin/www

{ battery: '72',
  signal: '-1',
  phonedate: '09-08-2015',
  dom: '9',
  loc: '52.05351615,1.12653186' }
POST /admin/api/phone-data 200 29.914 ms - 31
POST /admin/api/phone-data 500 595.693 ms - 4723

我在这里做错了什么,我是否错过了关闭以前的连接之类的东西?任何指针都将不胜感激。

非常感谢。

【问题讨论】:

  • 你在控制台上搞什么鬼还为你提供休息客户端的示例请求
  • 您的应用程序日志,您应该会在日志中看到错误
  • 我没有登录到文件,只是控制台

标签: javascript node.js mongodb express mongoose


【解决方案1】:

问题出在以下行:

phone = new phone();

您正在导入模块 ../models/phonedata-api 并将其分配给文件顶部的新变量 phone,然后您将使用该类创建一个实例并将其分配回同一变量。因此,下次调用路由时,变量phone 不再是函数,而是对象的实例。尝试在路由中创建一个新变量,而不是重复使用 phone

【讨论】:

    【解决方案2】:

    会尝试类似的东西

    new phone(req.body).save(function(err) {...
    

    为了避免 var phone 被分配一个新值

    【讨论】:

      【解决方案3】:

      好的, 所以我同意以上两个 cmet,这是你可以做的来解决你的问题。

      • 第一件事:不要重新分配任何变量。使用另一个变量名。使用 const
      • 此外,您首先创建模式的新实例,然后为它们分配值,您可以将对象作为参数发送给模式构造函数,以便它将使用您的值生成模式实例。

        const express = require('express'); const phone = require('../models/phonedata-api'); 常量路由器 = express.Router(); const bodyParser = require('body-parser'); router.use(bodyParser.json()); // 支持 json 编码的正文 router.use(bodyParser.urlencoded({extended: true })); // 支持编码体

        router.post('/api/phone-data', function(req, res) {

         let data = {
            loc:req.body.loc,
            battery:req.body.battery, signal:req.body.signal, 
            phonedate:req.body.phonedate,
            day_of_month: dom
            }
        
        
        var phoneItem = new phone(data);
        
        phoneItem .save(function(err) {
        if(err) 
            res.send(err); 
            })
        
        res.send('Phone data recived successfully');
        console.log(req.body);
        });
        
        module.exports = router;
        

      希望这能解决您的问题。

      【讨论】:

        猜你喜欢
        • 2021-05-15
        • 2014-04-12
        • 2020-07-22
        • 2016-12-09
        • 1970-01-01
        • 2016-04-08
        • 2017-03-15
        • 2011-01-22
        • 2020-05-28
        相关资源
        最近更新 更多