2017-03-07 4 views
0

Ich lerne NodeJS und versuche, lokal eine gefälschte Website einzurichten. Grundsätzlich ist es eine Website, die die WOW AuctionHouse API verwendet. Ich nehme die Daten aus der Anfrage, parse sie zu JSON und versuche, sie in die DB zu schreiben. Das Problem ist, wenn ich die Auktionen.save innerhalb der Anfrage stelle, erkennt es nicht die .save Funktion als eine Funktion (vorausgesetzt ich bin außerhalb des Bereichs dafür) und wenn ich es außerhalb des Problems stelle, kommt es von der asynchronen Natur, und ich bekomme ein leerer Eintrag in meiner Datenbank. Hier ist der Code:Abrufen von API-Daten und Schreiben in MongoDB mit NodeJS

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

Ist dies auch der richtige Weg, es zu tun? Gibt es einen besseren Weg? Ich habe eine ganze Weile daran fest gehalten und es wurde extrem frustrierend. Andere Dinge, die ich versuchte, sind:

  • Timeout-Funktion außerhalb der Anforderung, so dass es für die ganze Sache wartet kopiert werden, aber das funktioniert nicht bekomme ich das gleiche Problem, wie es innen versuchen, heißt es .save nicht a Funktion
  • Versuchte Aufruf einer Funktion auf dem äußersten Bereich definiert, während in der Anfrage, aber das sagt mir auch .save ist keine Funktion.
+0

starten: var postSchema = mongoose.Schema ({name: String, mtype: String, Preis: Zeichenfolge}); varpost = mongoose.model ('Post', postSchema); var newPost = neues Kätzchen(); newPost.name = newPost.mType = // nicht Typ verwenden sie reserviert ist newPost.price = newPost.save (function (err, mpost) { if (err) console.error (err); console.log (mPost); }); –

+0

Ich bin nicht sicher, was das ist, zu tun suposed zu, aber ich habe den exakt gleichen Fehler: newPost.price = newPost.save (function (err, mpost) { ^ Typeerror: newPost.save ist keine Funktion Auch soweit ich weiß, es ist ein Problem mit dem Umfang des Mungos (wo ich es verwenden kann) – Dragan

Antwort

1

Ich denke, Sie müssen möglicherweise Ihre Anfrage in einen Event-Listener einbinden. Dadurch wird sichergestellt, dass die Anfrage ausgeführt wird, sobald der Server den Startvorgang beendet hat. Hier ist ein kurzes Beispiel.

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

Der gleiche Fehler wie die ganze Zeit, Auktionen.save ist keine Funktion (es funktioniert, wenn ich es außerhalb von versuchen beliebige Funktion) Edit: Tut mir leid, eigentlich passiert gar nichts Code wird nicht ausgeführt (keine Konsolenprotokolle, nichts) – Dragan

+0

Ich habe Ihren Code bearbeitet und das sollte funktionieren Sie müssen entscheiden, wie Sie die Daten speichern möchten zur Datenbank, wie ich die Auktionen sehen kann .json-Datei ist ziemlich groß, also möchten Sie vielleicht durchschleifen. Ich habe für Sie hier ein Gist erstellt https://gist.github.com/Fried-Chicken/7955f671b8ac9da08328752335d13b3c –

+0

Das ist großartig und es funktioniert, aber ein anderes Problem taucht auf. auctions.insert fügt einen nutzlosen Wert ein, nicht den Wert, den ich in der body-Variablen erhalte. Wenn ich versuche, body.save es sagt, es ist keine Funktion und ive versucht mit json.parse und json.stringify und es ist das gleiche Problem, ich denke, es hört auf, Auktionen als ein "Post" -Objekt zu behandeln. – Dragan

0

Versuchen Sie folgendes:

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

var newPost = new Kitten(); 

Dann später in Anfrage:

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