Node.js, Express和Mongoose,未定义数据
Node.js, Express and Mongoose, undefined data
这是一个新手问题:
我试图使用属性"cover"来删除与该集合相关的文件,但问题是它显示为"未定义"。有人遇到过这样的问题吗?谢谢! !
这是我的日志
完整结果- {__v: 0,_id: 5329 a730e4b6306a08297318,
公司:"自闭症",
覆盖:"44 f4a87035bd22c1995dcf0ab8af05b0",
描述:"自闭症",
:"自闭症",
name: 'asd'}
RESULT COVER - undefined
下面是我的代码:exports.delete = function(req,res){
if(!req.session.authorized){
res.json(403,{message:'YOU MUST BE LOGGED IN'});
return;
}
Product.find({_id:req.params.id}, function(err,result){
if (err){
res.json(401, {message: err});
}else{
console.log("FULL RESULT - " + result);
console.log("RESULT COVER - " + result.cover);
var prodCoverName = result.cover;
if (prodCoverName){
fs.exists('public/productAssets/'+ prodCoverName, function (exists) {
console.log('EXIST - public/productAssets/'+ prodCoverName);
fs.unlink('public/productAssets/'+ prodCoverName, function (err) {
if (err) throw err;
console.log('DELETED AT public/productAssets/'+ prodCoverName);
});
});
}
}
});
Product.findOneAndRemove({_id:req.params.id}, function(err,result){
if (err) res.json(401, {message: err});
else res.json(200, {message: result});
});
};
我不是猫鼬专家,但我的猜测是Product.find
函数,将调用它的回调与一个数组的文档,而不是一个单一的文档,所以你应该改变你的代码如下:
Product.find({_id:req.params.id}, function(err, results){
var result = results[0]; // either one result or nothing, because id is unique and we want the first result only.
或者使用findOne代替(这个用第一个结果回调,更快):
Product.findOne({_id:req.params.id}, function(err, result){
或者使用findById(更短更快):
Product.findById(req.params.id, function(err, result){
现在你可能会问,为什么在我的例子中,FULL RESULT是一个对象。下面是javascript中的代码:
你有console.log("FULL RESULT - " + result)
,在这里你记录一个字符串,你有字符串连接操作,在字符串和数组之间。当你试图连接一个字符串与非字符串,javascript试图强制它成一个字符串,所以在情况下,它不是未定义/null它会调用.toString
值的方法。数组的.toString
方法实际上执行return this.join(',')
。join
方法也是一个字符串连接。数组包含文档,因此javascript尝试将文档转换为字符串(它们实际上是对象),并调用document.toString()
。这是由mongoose实现的,以返回对象属性,这应该类似于util.inpsect(document);
。这个事件的另一个例子是从'result is ' + [1]
获取result is 1
。
为了避免这个问题,我建议,只要避免用字符串连接对象。代替console.log('result is ' + object)
尝试console.log(object)
或console('result is', object)
。
我刚刚意识到你在调用find的同时也调用了findOneAndRemove,这是一个竞争条件。.find
调用可能找不到任何东西,因为.findOneAndRemove
可能已经完成了。这可能会带来更多的问题。
- 一台特定计算机的Ajax请求数据未定义/失败
- JavaScript-获取数据属性的值返回未定义的值
- $.每个jquery循环打印一个“;未定义的“;对于getJSON请求后的每个元素,网格数据都会完美地打印出来
- 有了字段的名称,我如何用空白数据初始化对象的未定义字段
- Chart.js2.X中的条形值-数据集元数据未定义
- Json显示来自网站的数据显示仅未定义
- 引用错误:在尝试使用ajax发送数据时未定义
- 使用Breeze脱机数据时出现未定义的问题不是函数
- 无法读取数据“;对象名称“;未定义的角度方向
- Jquery从JSON获取数据(未定义)
- 从 Angular 数据工厂中的 HTTP POST 请求接收未定义的结果
- 服务变量分配了数据,但在访问时始终未定义
- 在脚本中从电子表格中获取数据:“未定义数据表”
- 下划线.js:未捕获的引用错误:未定义数据
- ASP.NET中从JSON返回的未定义数据
- oPage未定义数据表和twitter引导程序
- 数据表类型错误:未定义数据
- Angular中$http请求后的链接函数中未定义数据
- 需要帮助来解决 - 未捕获的引用错误:未定义数据
- Node.js, Express和Mongoose,未定义数据