上下文
正如下面详细解释的那样,我在网上搜索了大约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
如果有新鲜眼光的人知道将要发生什么,那将是惊人的。 谢谢
答案 0 :(得分:0)
此问题现已解决。如所怀疑的,这与之前和GitHub中提出的问题无关。问题是通过Postman传递的请求不适合mongoose schema
。这是因为各种文档的字段具有验证要求,因此在制定每个请求以抛出错误时只发生了一个小错误。
一旦我开始逐个测试req.body
元素,我就会遇到连续的错误,但是服务器开始正确地记录一些字段,尽管它是孤立的并且是一个接一个。在我找到合适的组合之前,这是测试所有领域的大开眼界。反直觉地,req.body
首先返回一个空对象,因为请求在第一个实例中被破坏了。
之前的所有尝试,即更改type
keyType
,使用body-parser
而不是express
内置中间件来处理JSON和网址请求等,好的尝试,但都是徒劳的。
谢谢大家的贡献,并与我一起研究。