2017-08-04 11 views
0

保存私はPUT要求を行う際にノードが私にこのエラーが表示されます。Nodejs - エクスプレス - マングース:PUTリクエストに問題のある方法

TypeError: product.save is not a function 

コントローラ/ product.jssave機能を参照)

これは文書を更新するための正しい形式ですが、この問題があります。

私は、コードの一部を共有しています:

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

答えて

1

Model.findは特定のmongooseオブジェクトではなく、アイテムの配列を返します。どちらでもお試しくださいModel.findOneまたはModel.findById(id,(err,data)={})

次に、save関数を呼び出すことができます。また別の方法がありますが、2つのクエリの代わりに1つのクエリを使用します。 Model.findOneAndUpdate()

これが役立ちます。

+0

Rajesh Danに感謝します。私はModel.findOneAndUpdate()を使用しており、すべて正常に動作します。 –

+0

もちろん、お手伝いします。 @AlfonsoSánchez! :) –

0

この

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

あなたは製品として製品を使用する必要があることを意味する代わり

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

を使用してくださいください。

1

このように、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'}) 
    }); 
}; 
関連する問題