簡體   English   中英

Node.js-Express-貓鼬:保存方法出現PUT請求問題

[英]Nodejs - Express - Mongoose: PUT Request problems with save method

當我發出PUT請求時,Node向我顯示此錯誤:

TypeError: product.save is not a function

(請參閱controllers / product.js中save函數)

我發現這是更新文檔的正確形式,但是我有這個問題。

我正在共享部分代碼:

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);

車型/ product.js

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);

控制器/ product.js

//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返回項目數組,而不是特定的貓鼬對象。 因此,請嘗試Model.findOneModel.findById(id,(err,data)={})

然后,您可以調用save功能。 還有另一種方法,而不是兩個查詢嘗試一個。 Model.findOneAndUpdate()

希望這可以幫助。

最好這樣使用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'})
    });
};

做這個

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);
        }

);
});
};

這意味着您需要將product用作Product

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM