2017-03-07 28 views
0

我在學習NodeJS並試圖在本地建立一個模擬網站。基本上,它是一個使用WOW AuctionHouse API的網站。我從請求中獲取數據,將其解析爲JSON並嘗試將其寫入數據庫。問題是,如果我把auctions.save放入請求中,它不會將.save函數識別爲一個函數(假設它不在該範圍之內),並且如果我將它放在問題的外面,則來自異步特性,我的數據庫中有一個空條目。這裏是代碼:獲取API數據並使用NodeJS寫入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') 
}); 

這是甚至正確的方法嗎?有沒有更好的辦法?我一直堅持這一段時間,它變得非常令人沮喪。其他的事情我想是:要複製,因此等待整個事情的要求外

  • 超時功能,但不工作我得到同樣的問題,因爲裏面嘗試它 ,它說.save不是函數
  • 嘗試調用在outtermost作用域上定義的函數,而在請求內但這也告訴我.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){ 如果(ERR)console.error(ERR); console.log(mPost); }); –

+0

林不知道這是什麼suposed做的,但我得到確切同樣的錯誤: newPost.price = newPost.save(函數(ERR,mPost){ ^ 類型錯誤:newPost.save不是一個函數 另外,據我計算出它與貓鼬的範圍(我可以使用它的範圍)的問題 – Dragan

回答

1

我想你可能需要將你的請求包裝在一個事件監聽器中。這將確保請求在服務器完成啓動後運行,而不是之前。這是一個簡單的例子。在請求以後

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

var newPost = new Kitten(); 

然後::

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,它說它不是一個函數,並且我嘗試過使用json.parse和json.stringify以及它的同樣的問題,我認爲它會停止將拍賣視爲「發佈」對象。 – Dragan

0

嘗試此

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