Javascript Nodejs-Express-Mongoose:使用save方法处理请求问题
节点在我发出PUT请求时显示此错误:Javascript Nodejs-Express-Mongoose:使用save方法处理请求问题,javascript,node.js,mongodb,express,mongoose,Javascript,Node.js,Mongodb,Express,Mongoose,节点在我发出PUT请求时显示此错误: TypeError:product.save不是函数 (参考controllers/product.js中的保存功能) 我发现这是更新文档的正确表单,但我有这个问题 我正在分享部分代码: app.js var api = express.Router(); api.route('/products') .get(ProductCtrl.findAll) .post(ProductCtrl.add); api.route('/products/:i
TypeError:product.save不是函数
(参考controllers/product.js中的保存
功能)
我发现这是更新文档的正确表单,但我有这个问题
我正在分享部分代码:
app.js
var api = express.Router();
api.route('/products')
.get(ProductCtrl.findAll)
.post(ProductCtrl.add);
api.route('/products/:isbn')
.get(ProductCtrl.findByISBN)
.delete(ProductCtrl.delete)
.put(ProductCtrl.update);
app.use('/api', api);
var mongoose = require('mongoose');
var Schema = mongoose.schema;
var productSchema = mongoose.Schema({
isbn: {type: String},
title: {type: String},
author: {type: String},
template: {type: String},
active: {type: Number} //1 - Active, 0 - Inactive
});
module.exports = mongoose.model('Product', productSchema);
//PUT - Update the product by ISBN
exports.update = function(req, res){
Product.find(req.params.isbn, function(err, product){
if(!product) res.status(404).send({message: 'Product not exits'});
console.log("PUT - /products/" + req.params.isbn);
product.isbn = req.body.isbn;
product.title = req.body.title;
product.author = req.body.author;
product.active = req.body.active;
product.template = req.body.template;
product.save(function(err){
if(err) return res.send(500,err.message);
console.log("Successfully updated: " + req.body.isbn);
res.status(200).json(product);
});
});
};
models/product.js
var api = express.Router();
api.route('/products')
.get(ProductCtrl.findAll)
.post(ProductCtrl.add);
api.route('/products/:isbn')
.get(ProductCtrl.findByISBN)
.delete(ProductCtrl.delete)
.put(ProductCtrl.update);
app.use('/api', api);
var mongoose = require('mongoose');
var Schema = mongoose.schema;
var productSchema = mongoose.Schema({
isbn: {type: String},
title: {type: String},
author: {type: String},
template: {type: String},
active: {type: Number} //1 - Active, 0 - Inactive
});
module.exports = mongoose.model('Product', productSchema);
//PUT - Update the product by ISBN
exports.update = function(req, res){
Product.find(req.params.isbn, function(err, product){
if(!product) res.status(404).send({message: 'Product not exits'});
console.log("PUT - /products/" + req.params.isbn);
product.isbn = req.body.isbn;
product.title = req.body.title;
product.author = req.body.author;
product.active = req.body.active;
product.template = req.body.template;
product.save(function(err){
if(err) return res.send(500,err.message);
console.log("Successfully updated: " + req.body.isbn);
res.status(200).json(product);
});
});
};
控制器/product.js
var api = express.Router();
api.route('/products')
.get(ProductCtrl.findAll)
.post(ProductCtrl.add);
api.route('/products/:isbn')
.get(ProductCtrl.findByISBN)
.delete(ProductCtrl.delete)
.put(ProductCtrl.update);
app.use('/api', api);
var mongoose = require('mongoose');
var Schema = mongoose.schema;
var productSchema = mongoose.Schema({
isbn: {type: String},
title: {type: String},
author: {type: String},
template: {type: String},
active: {type: Number} //1 - Active, 0 - Inactive
});
module.exports = mongoose.model('Product', productSchema);
//PUT - Update the product by ISBN
exports.update = function(req, res){
Product.find(req.params.isbn, function(err, product){
if(!product) res.status(404).send({message: 'Product not exits'});
console.log("PUT - /products/" + req.params.isbn);
product.isbn = req.body.isbn;
product.title = req.body.title;
product.author = req.body.author;
product.active = req.body.active;
product.template = req.body.template;
product.save(function(err){
if(err) return res.send(500,err.message);
console.log("Successfully updated: " + req.body.isbn);
res.status(200).json(product);
});
});
};
这是因为
Model.find
返回一个项目数组,而不是一个特定的mongoose对象。因此,请尝试Model.findOne
或Model.findById(id,(err,data)={})
然后您可以调用save
函数。还有另一种方法,不是两个查询,而是尝试一个查询<代码>Model.findOneAndUpdate()
希望这有帮助。这是因为
模型。find
返回一个项目数组,而不是特定的mongoose对象。因此,请尝试Model.findOne
或Model.findById(id,(err,data)={})
然后您可以调用save
函数。还有另一种方法,不是两个查询,而是尝试一个查询<代码>Model.findOneAndUpdate()
希望这有帮助。做这个
Product.find(req.params.isbn, function(err, product){
if(!product) res.status(404).send({message: 'Product not exits'});
console.log("PUT - /products/" + req.params.isbn);
product.isbn = req.body.isbn;
product.title = req.body.title;
product.author = req.body.author;
product.active = req.body.active;
product.template = req.body.template;
let updateproduct = new Product(product);
updateproduct.save(function(err){
if(err) return res.send(500,err.message);
console.log("Successfully updated: " + req.body.isbn);
res.status(200).json(product);
});
});
};
这样做
Product.find(req.params.isbn, function(err, product){
if(!product) res.status(404).send({message: 'Product not exits'});
console.log("PUT - /products/" + req.params.isbn);
product.isbn = req.body.isbn;
product.title = req.body.title;
product.author = req.body.author;
product.active = req.body.active;
product.template = req.body.template;
let updateproduct = new Product(product);
updateproduct.save(function(err){
if(err) return res.send(500,err.message);
console.log("Successfully updated: " + req.body.isbn);
res.status(200).json(product);
});
});
};
请用这个
exports.update = function(req, res){
Product.find(req.params.isbn, function(err, product){
if(!product) res.status(404).send({message: 'Product not exits'});
console.log("PUT - /products/" + req.params.isbn);
product.isbn = req.body.isbn;
product.title = req.body.title;
product.author = req.body.author;
product.active = req.body.active;
product.template = req.body.template;
Product.save(product,function(err,data){
if(err) return res.send(500,err.message);
console.log("Successfully updated: " + req.body.isbn);
res.status(200).json(product);
});
});
};
而不是
exports.update = function(req, res){
Product.find(req.params.isbn, function(err, product){
if(!product) res.status(404).send({message: 'Product not exits'});
console.log("PUT - /products/" + req.params.isbn);
product.isbn = req.body.isbn;
product.title = req.body.title;
product.author = req.body.author;
product.active = req.body.active;
product.template = req.body.template;
product.save(function(err){
if(err) return res.send(500,err.message);
console.log("Successfully updated: " + req.body.isbn);
res.status(200).json(product);
}
);
});
};
这意味着您需要使用产品作为产品请使用此
exports.update = function(req, res){
Product.find(req.params.isbn, function(err, product){
if(!product) res.status(404).send({message: 'Product not exits'});
console.log("PUT - /products/" + req.params.isbn);
product.isbn = req.body.isbn;
product.title = req.body.title;
product.author = req.body.author;
product.active = req.body.active;
product.template = req.body.template;
Product.save(product,function(err,data){
if(err) return res.send(500,err.message);
console.log("Successfully updated: " + req.body.isbn);
res.status(200).json(product);
});
});
};
而不是
exports.update = function(req, res){
Product.find(req.params.isbn, function(err, product){
if(!product) res.status(404).send({message: 'Product not exits'});
console.log("PUT - /products/" + req.params.isbn);
product.isbn = req.body.isbn;
product.title = req.body.title;
product.author = req.body.author;
product.active = req.body.active;
product.template = req.body.template;
product.save(function(err){
if(err) return res.send(500,err.message);
console.log("Successfully updated: " + req.body.isbn);
res.status(200).json(product);
}
);
});
};
这意味着您需要使用产品作为产品最好使用mongoose
findOneAndUpdate
方法进行更新。这样看起来既简洁又干净
exports.update = function(req, res){
Product
.findOneAndUpdate({ isbn: req.params.isbn }, req.body)
.exec(function(err, product){
if(err) return res.status(500).json({err: err.message}):
res.json({product, message: 'Successfully updated'})
});
};
最好使用mongoose
findOneAndUpdate
方法进行如下更新。这样看起来既简洁又干净
exports.update = function(req, res){
Product
.findOneAndUpdate({ isbn: req.params.isbn }, req.body)
.exec(function(err, product){
if(err) return res.status(500).json({err: err.message}):
res.json({product, message: 'Successfully updated'})
});
};
谢谢Rajesh Dan,我使用了Model.findOneAndUpdate()和所有预期的工作!当然,很乐意帮忙@阿方索·桑切斯!:)谢谢Rajesh Dan,我使用了Model.findOneAndUpdate()和所有预期的工作!当然,很乐意帮忙@阿方索·桑切斯!:)