Mongoose 5.0.15 / MongoDB 3.6.4转换为数组失败[NaN,NaN]

时间:2018-05-11 14:20:23

标签: node.js mongodb express mongoose restful-architecture

上下文

这不是duplicate of this

正如下面详细解释的那样,我在网上搜索了大约20个类似的错误或文章,但到目前为止还没有解决这个问题。

我正在两个不同的操作系统,Windows 8.1和Linux / Ubuntu(16.4)中开发基于位置的应用程序 以下引擎在Ubuntu机器上运行;但是,无论依赖版本或操作系统如何,我得到的错误都是完全相同的。

Node.js ~4.2.6 NPM ~ 3.5.2 MongoDB ~ 3.6.4 Mongoose ~5.0.15

目前的行为是什么?

我收到了这个错误,尽管花了几天研究类似的错误并测试/尝试不同的东西。 来自邮递员:

{
    "errors": {
        "coords": {
        "message": "Cast to Array failed for value \"[ NaN, NaN ]\" at path \"coords\"",
        "name": "CastError",
        "stringValue": "\"[ NaN, NaN ]\"",
        "kind": "Array",
        "value": [
            null,
            null
        ],
        "path": "coords",
        "reason": {
            "message": "Cast to [number] failed for value \"[null]\" at path \"coords\"",
           ....
     "_message": "Location validation failed",
     "message": "Location validation failed: coords: Cast to Array failed for value \"[ NaN, NaN ]\" at 
      path \"coords\", name: Path `name` is required., openingTimes.0.days: Path `days` is required., 
      openingTimes.0.closed: Path `closed` is required.",
       "name": "ValidationError"
  }

我的假设是,这不仅仅是由于Cast Error导致的问题,而且这个特定POST方法的Schema出了问题。请注意,相同的Schema用于GET方法,它的工作方式就像魅力一样。

重现的步骤。

在开发的这个阶段,我正在设计API并使用Mongoose的Schema来建模数据。

这是API的模型:

const` mongoose = require("mongoose");
const reviewSchema = new mongoose.Schema({
   author: String,
   rating: {$type: Number, required: true, min: 0, max: 5},
   timestamp: {$type: Date, "default": Date.now},
    reviewText: String
}, {typeKey: "$type"});

const openingTimeSchema = new mongoose.Schema({
  days: {$type: String, required: true},
  opening: String,
  closing: String,
  closed: {$type: Boolean, required: true}
 }, {typeKey: "$type"});

const locationSchema = new mongoose.Schema({
  name: {$type: String, required: true},
  rating: {$type: Number, "default": 0, min: 0, max: 5},
  address: String,
  facilities: [String],
  coords: {$type: [[Number]], index: '2dsphere', required:true},
  openingTimes: [openingTimeSchema],
  reviews: [reviewSchema]
 }, {typeKey: "$type"});

 mongoose.model("Location", locationSchema);

注意我正在使用不同帖子中建议的typeKey,以及geoJSON对象的Mongoose文档中的建议。即使不使用typeKey,错误仍然存​​在。

控制器

const mongoose = require("mongoose");
const Loc = mongoose.model("Location");

const theEarth = (function(){
const earthRadious = 6371;    
const getRadsFromDistance = (distance) => {
    return parseFloat(distance / earthRadious);
 };

 return {
    getRadsFromDistance: getRadsFromDistance
 };

 })();

var sendJsonResponse = (res, status, content) =>{
  res.status(status);
  res.json(content);
 };

module.exports.locationsCreate = (req, res) => {
   Loc.create({
    name: req.body.name,
    address: req.body.address,
    facilities: req.body.facilities,
    coords: [parseFloat(req.body.lng), parseFloat(req.body.lat)],
    openingTimes: [{
        days: req.body.days1,
        opening: req.body.opening1,
        closing: req.body.closing1,
        closed: req.body.closed1
     }]
    }, function (err, location){
            if (err){
                sendJsonResponse(res, 400, err);
            }
            else{
                sendJsonResponse(res, 201, location);
            }
   });


 };

预期的行为是POST Postman中创建的虚拟位置:

POST / api / locations HTTP / 1.1

主持人:localhost:3000

名称:咖啡BlaBlaBla

地址:Midnowhere高街天堂435号

设施:热咖啡,早餐,Wifi

lng:2.3567

lat:41.5676

days1:周一至周五

开放时间:上午8:00

关闭1:下午5:00

closed1:false

缓存控制:无缓存

内容类型:application / x-www-form-urlencoded

如果有新鲜眼光的人知道将要发生什么,那将是惊人的。 谢谢

1 个答案:

答案 0 :(得分:0)

此问题现已解决。如所怀疑的,这与之前和GitHub中提出的问题无关。问题是通过Postman传递的请求不适合mongoose schema。这是因为各种文档的字段具有验证要求,因此在制定每个请求以抛出错误时只发生了一个小错误。

一旦我开始逐个测试req.body元素,我就会遇到连续的错误,但是服务器开始正确地记录一些字段,尽管它是孤立的并且是一个接一个。在我找到合适的组合之前,这是测试所有领域的大开眼界。反直觉地,req.body首先返回一个空对象,因为请求在第一个实例中被破坏了。

之前的所有尝试,即更改type keyType,使用body-parser而不是express内置中间件来处理JSON和网址请求等,好的尝试,但都是徒劳的。

谢谢大家的贡献,并与我一起研究。