2016-12-20 16 views
1

この質問は既に存在しますが、私が見つけた解決策はうまくいきませんでした。私はNode.jsの基本的な作成機能を構築しています。最初にオブジェクトがすでに存在するかどうかをチェックし、存在しない場合は作成します。すべての条件にelse ifreturnを追加しても、このエラーが発生します。しかし、それはすべてが関係なく実行されるようです。これは私のコードです:Node.jsエラー:送信後にヘッダーを設定できません

controllers/shop.js:

var Shop = require('../models/shop').model; 
module.exports = { 
    create: function(req, res) { 
     if(typeof(req) != 'object') 
      return res.status(400).send({error: Error.InvalidInput}); 
     if(req.body.name === null) return res.status(400).json({error: Error.missingParameter('name')}); 
     Shop.findOne({name: req.body.name}, function(err, shop){ 
      if(err) return res.status(500).json({error: Error.unknownError}); 
      else if (shop) return res.status(409).json({error: Error.alreadyExists('Shop')}); 
     }).exec(Shop.create({name: req.body.name}, function(err, shop) { 
      if (err) return res.status(500).json({error: Error.unknownError}); 
      else if (shop) return res.status(201).json(shop); 
      else if (!shop) return res.status(400).json({error: Error.createFailed('Shop')}); 
     })); 
    }, 
} 
+0

どのような応答が得られますか? – Sam

+0

@Sam Error:ヘッダーを送信した後に設定することはできません。 – SalmaFG

答えて

1

あなたはfind方法でcallbackを渡したりexecで関数を使用するが、それらの両方が非同期と同時に起動されるので、両方を使用すべきでないのどちらか。

以下のようにコードをリファクタリングすることができます。

var Shop = require('../models/shop').model; 
module.exports = { 
    create: function(req, res) { 
     if(typeof(req) != 'object') 
      return res.status(400).send({error: Error.InvalidInput}); 
     if(req.body.name === null) return res.status(400).json({error: Error.missingParameter('name')}); 
     Shop.findOne({name: req.body.name}, function(err, shop){ 
      if(err) return res.status(500).json({error: Error.unknownError}); 
      else if (shop) return res.status(409).json({error: Error.alreadyExists('Shop')}); 
      else { 
       Shop.create({name: req.body.name}, function(err, shop) { 
       if (err) return res.status(500).json({error: Error.unknownError}); 
       else if (shop) return res.status(201).json(shop); 
       else if (!shop) return res.status(400).json({error: Error.createFailed('Shop')}); 
     }); 
      } 
     }); 
    }, 
} 
+0

これは機能します!しかし、私が受け入れる前に 'find()'を 'findOne()'に変更できますか? 'find'は常に配列を返します。なぜなら配列が空であっても' else if(shop) 'という条件を常に真にしてしまうからです。再度、感謝します! :) – SalmaFG

+0

@SalmaFGはい、確かに更新されました:-) – Aruna

0

ifステートメントの応答ステータスとエラー/その他のメッセージの変数を設定してみてください。あなたの作成関数の最後に、変数で設定された単一のレスポンスオブジェクトを返す

var Shop = require('../models/shop').model; 
module.exports = { 
    create: function(req, res) { 
     var status = 200; 
     var message = ""; 
     if(typeof(req) != 'object') 
      status = 400; 
      message = Error.InvalidInput; 
      ... 
     return res.status(status).send({error: message}); 
      }); 
     })); 
    }, 
} 
関連する問題