2017-03-07 6 views
0

NodeJSを学習し、模擬ウェブサイトをローカルに配置しようとしています。基本的には、WOW AuctionHouse APIを使用するWebサイトです。リクエストからデータを取り出し、JSONに解析してDBに書き込もうとします。問題は、auctions.saveをリクエスト内に置くと、関数として.save関数が認識されません(範囲がわからないと仮定します)。問題外に配置すると、非同期性の問題が発生します私のDBの空のエントリ。コードは次のとおりです。NodeJSを使用してAPIデータを取得してMongoDBに書き込む

var express = require('express'); 
var hbs = require('express-hbs'); 
var mongoose = require('mongoose'); 
//var blizzard = require('blizzard.js').initialize({ apikey: "xxx" }); 

mongoose.connect('mongodb://127.0.0.1/blood_of_sargeras') 

var post = mongoose.model(
    'post', 
    { 
    name: String, 
    type: String, 
    price: String 
    }); 

var app = express(); 

app.engine('hbs', hbs.express4({ 
    partialsDir:__dirname+'/views/partials' 
})); 

app.set('view engine', 'hbs'); 
app.set('views', __dirname + '/views'); 

app.use('/static', express.static('static')); 

var request = require("request"); 
var url = "http://auction-api-eu.worldofwarcraft.com/auction-data/xxx-xxx/auctions.json" 
var auctions = new post; 

request({ 
    url: url, 
    json: true 
}, function (error, response, body) { 

    if (!error && response.statusCode === 200) { 
     auctions = JSON.stringify(body); 
     post.save(function (err) { 
      if(err) 
      console.log("Error with database!"); 
      else 
      console.log("Data written to DB!"); 

     }) 
    } 
}); 

app.get('/', function (req, res){ 

    post.find({}, function (err, o){ 
    if (err) 
     console.log('Database error!'); 
    else{ 
     res.render('index', o); 
    } 
    }); 
}); 

app.listen(80, function(){ 
    console.log('Listening on port 80') 
}); 

これは正しい方法ですか?より良い方法がありますか?私はかなり長い間このことに固執しており、非常にイライラしています。私が試した他のものである:それは全体のことを待って要求外

  • タイムアウト機能をコピーするが、それdoesntの仕事は、私は内部 それをしようとするのと同じ問題を取得し、それが.SAVEではないと言います関数
  • 要求の中で最も外側のスコープで定義された関数を呼び出そうとしましたが、それはまた私に.saveは関数ではないことを伝えます。
+0

このお試しください: するvar postSchemaを= mongoose.Schema({名:文字列、MTYPE:文字列、価格:文字列}); var post = mongoose.model( 'Post'、postSchema); var newPost = new Kitten(); newPost.name = newPost.mType = //それが予約されているタイプを使用しない newPost.price = newPost.save(関数(ERR、mpostを){ IF(ERR)console.error(ERR)。 (mPost); }); –

+0

これが行うことにsuposedれるものイムわからないが、私は正確に同じエラーを取得: newPost.price = newPost.save(機能(ERR、mpostを){ ^ 例外TypeError:newPost.saveが関数 ではありません また、モンゴースの範囲に問題があるとわかった限り(私はそれが使えます) – Dragan

答えて

1

イベントリスナーでリクエストをラップする必要があると思われる場合があります。これにより、サーバーが以前よりも起動を完了した後に要求が確実に実行されます。ここに簡単な例があります。

app.on('listening', function() { 
    // Run your request to the WoW auction house once the express server has started up 
    request({ 
     url: url, 
     json: true 
    }, function (error, response, body) { 

     if (!error && response.statusCode === 200) { 
      auctions = JSON.stringify(body); 
      post.save(function (err) { 
       if(err) 
        console.log("Error with database!"); 
       else 
        console.log("Data written to DB!"); 

      }) 
     } 
    }); 
}); 
+0

auctions.saveは全時間と同じエラーです。どのようなコードも実行されません(コンソールログなし、何もありません) – Dragan

+0

私はあなたのコードを編集しました。これはうまくいくはずです。データの保存方法を決める必要があります私はオークションが.jsonファイルはかなり大きいので、それをループしたいかもしれません。 私はここであなたの要点を作成しました https://gist.github.com/Fried-Chicken/7955f671b8ac9da08328752335d13b3c –

+0

すごくうまくいっていますが、別の問題がポップアップします。 auctions.insertは、body変数の値ではなく、無駄な値を挿入します。私がbody.saveを試してみると、関数とiveがjson.parseとjson.stringifyで同じことを試みたのではなく、オークションを 'post'オブジェクトとして扱うのをやめてしまうと思います。 – Dragan

0

これを試してみてください:

var postSchema = mongoose.Schema({name: String,mType: String,price: String}); 
var post = mongoose.model('Post',postSchema); 

var newPost = new Kitten(); 

をその後の要求に:

newPost.name = auctions.name; 
newPost.mType = auctions.type; //do not use type it is reserved 
newPost.price = auctions.price 

newPost.save(function(err, mPost) { 
    if (err) console.error(err); 
    console.log(mPost); 
}); 
関連する問題