2017-10-25 25 views
0

今日はMERNアプリケーションで作業を開始しましたが、restful apiを書きました。最初に私はデータベースを保存するためにmlabを使用しています。私はユーザーを作成した後、このデータベースに正常に接続しました。私は手動でcollectionを作成し、これにいくつかのデータを挿入することができますcollection。私のserver.jsファイルから、ここにデータを格納することができます。Express JS/MongoDBポストが動作しない

MongoClient.connect(db_url, (err, database) => { 
    if (err) return console.log(err); 
    var collection = database.collection('memories'); // Collection called memories 
    app.listen(3000,() => { 
     console.log("Listening on 3000"); 
    }); 
}); 

すごくいいですが、私は次のレベルにしたいと思います。コレクションMemoryCRUD apiを書きたいと思います。 djangoから来て、まずmodelを作りたいと思います。したがって、私のmodels/memory.jsに:

var mongoose = require('mongoose'); 
var Schema = mongoose.Schema; 

var MemorySchema = new Schema({ 
    name: String, 
    description: String 
}); 

module.exports = mongoose.model('Memory', MemorySchema); 

それから私は先に行って、私のroutes/api/api.jsに取り組んで開始しました:

let router = require('express').Router(); 
let Memory = require('../../../models/memories'); 

router.use(function (req, res, next) { 
    console.log("Something is happening"); 
    next(); // Request stops at middleware without next() 
}); 

router.route('/memory') 
    .post(function (req, res) { 
     let memory = new Memory(); 
     memory.name = req.body.name; 
     memory.description = req.body.description; 

     memory.save(function (err) { 
      if (err) { 
       res.send(err); 
      } 
      res.json({message: 'Memory Created'}); 
     }); 
    }) 

    .get(function (req, res) { 
     res.json({message: 'First memory'}); 
    }); 


module.exports = router; 

そして、私のserver.jsに私はこのモジュールを呼び出す:

const apiRoutes = require('./routes/api/api'); 
app.use('/api/', apiRoutes); 

しかし、後に投稿のAPIをpostmanでテストすると、POSTリクエストは、ただちにCould not get any response。ただし、GETリクエストが機能します。私は何が欠けていますか?

EDIT:だからpost機能はトラブルのモデルインスタンスを保存をしている...

答えて

0

てみてください、あなたが何かを返されたかどうかを確認するために、その後、セーブ機能のコールバックの最初のパラメータとしてres.json(results, { message: "Memory Created" })resultsを追加します。

0

ポストとgetメソッドの主な違いは、postメソッドがMongooseを使用し、getが取得しない点です。データベースへの接続に失敗すると、memory.save(...)が正常に機能しないため、応答がタイムアウトする可能性があります。また、コールバックの外に送信されたレスポンスは保存されません。そのため、プログラムに入力しないと応答は送信されません。最終的に要求はタイムアウトになります。

あなたが次の行にモデルを登録し、あなたのモデルファイルで:

module.exports = mongoose.model('Memory', MemorySchema); 

マングースは、その後memorysコレクション内のデータを検索します。あなたは

module.exports = mongoose.model('Memory', MemorySchema, 'memories'); 

に変更した場合は、代わりに思い出コレクションを使用します。これはあなたが投稿したdb-to-snippetと一貫しています。それがあなたの問題を解決するかどうかは分かりません。接続コードをネイティブmongoクライアントの代わりに

mongoose.connect(dburl, { 
    useMongoClient: true 
}); 

に変更することをお勧めします。これらの行を追加することもできます

mongoose.connection.on('connected', function() { 
    console.log('Mongoose connected'); 
}); 

mongoose.connection.on('error', function (err) { 
    console.log('Mongoose connection error: ' + err); 
}); 

mongoose.connection.on('disconnected', function() { 
    console.log('Mongoose disconnected'); 
}); 

デバッグに役立つ接続コードの直後です。アプリの起動時に接続されていることを確認してください。

ノード端末ウィンドウでError: Can't set headers after they are sent.に似たエラーが表示された場合は、投稿機能で2つの応答を送信している可能性があります。保存中にエラーが発生した場合は、ブロックif(err)を入力して、応答を非同期で送信し、res.json(...)レスポンスに送信して送信します。

したがって、応答を送信してから関数を終了する必要があります。どちらのこの

res.send(err); 
return; 

またはJSONレスポンスのためにこの

return res.send(err); 

同じようにのように。

これで問題が解決しない場合は、デバッガ(node --inspectまたはnodemon --inspect)を起動するか、投稿機能内にconsole.log('inside post');を挿入して実際に入力していることを確認する必要があります。

関連する問題