2016-12-24 31 views
0

我正在嘗試從api創建節點種子腳本。該API顯示在多個頁面中,並具有一個名爲「numberOfPages」的屬性。如何運行依賴於第一個API設置的變量的API?

在每一頁上,我將播種的數據庫。所以,我打算採用'numberOfPages'變量並運行一個for循環,併爲X頁面提供適當的api響應。目前,當運行.on函數時,numberOfPages顯示爲undefined。它在下面的if語句中運行時顯示。異步執行此操作的適當方法是什麼?

"use strict" 

var express = require('express'); 
var bodyParser = require('body-parser'); 
var mongoose = require('mongoose'); 
var session = require('express-session'); 
var MongoStore = require('connect-mongo')(session); 
var request = require('request'); 

let key = 'MAGICNUMBER'; 
let baseRequest = "http://apiurl?key=" + key; 


mongoose.connect("mongodb://localhost:27017/myDatabase"); 
const db = mongoose.connection; 
// mongo error 
db.on('error', console.error.bind(console, 'connection error:'));` 
    function populateController(){ 
     let numberOfPages; 
     request(apiRequest, function (error, response, body) { 
     if (!error && response.statusCode == 200) { 
      let apiResponse = JSON.parse(body); 
      numberOfPages = parseInt(apiResponse.numberOfPages); 
     } 
     }).on('end',() => { 
     console.log('ended'); 
     console.log(numberOfPages); 
     }) }) 

最後,節日快樂。

+0

作爲一個旁註,我敢肯定我能爲循環if語句中運行它,但它開始覺得真凌亂的對我來說嵌套這麼遠。 – notthehoff

+0

難道[我的回答(https://stackoverflow.com/questions/41316729/how-to-run-api-that-is-dependent-on-variable-set-from-first-api/41317336#41317336)以下幫你?任何意見? – rsp

回答

1

你的代碼似乎對我好,它應該工作。我在代碼中添加了一些日誌記錄。

function populateController(){ 
    let numberOfPages; 
    console.log('Starting'); 
    request(apiRequest, function (error, response, body) { 
    if (!error && response.statusCode == 200) { 
     let apiResponse = JSON.parse(body); 
     numberOfPages = parseInt(apiResponse.numberOfPages); 
     console.log('Result', numberOfPages); 
    } 
    else { 
     console.error('Error in request', response.statusCode, err); 
    } 
    }).on('end',() => { 
    console.log('Ended', numberOfPages); 
    }); 
}); 

這應該寫這個,或者一些錯誤。

Starting 
Result 42 
Ended 42 

順便說一句,異步的東西很麻煩。我建議使用異步等待。您需要習慣它們,並且不能完全離開Node回調。儘管如此,他們可能會讓事情更清潔。

加上相關的帖子:Why doesn't request.on() work in Node.js - 當心同步/異步執行命令!某些日誌記錄可以幫助您瞭解執行順序。

節日快樂!

1

如果您使用request不要自行解析JSON(至少在沒有包裝它try/catch或使用tryjson因爲你的風險在壞數據崩潰您的應用程序)。

此外,還要確保你正在做的請求之前已經連接到數據庫。

,還可以使用在parseInt明確的基礎。

它很容易將邏輯分成步驟,如果在異步流是混亂:

db.on('connected', startRequests); 

    function startRequests() { 
    request.get({ 
     url: apiRequest, 
     json: true, 
     headers: {'User-Agent': 'request'} 
     }, (err, res, data) => { 
     if (err || res.statusCode !== 200) { 
      // handle error 
      console.log('Cannot get number of pages'); 
     } else { 
      // data is already parsed as JSON: 
      console.log(data.html_url); 
      handlePages(parseInt(data.numberOfPages, 10)); 
     } 
    }); 
    } 

    function handlePages(numberOfPages) { 
    // you have the numberOfPages here 
    console.log(numberOfPages); 
    } 
相關問題