如何运行依赖于第一个api变量集的api?

时间:2016-12-24 20:46:09

标签: javascript node.js asynchronous request

我正在尝试从api创建节点种子脚本。 api显示在多个页面中,并且具有名为“numberOfPages”的属性。

在每个页面上,我将播种数据库。所以,我打算采用'numberOfPages'变量并运行for循环,并为X页面提供相应的api响应。目前,numberOfPages在通过.on函数运行时显示为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);
      }) })

最后,节日快乐。

2 个答案:

答案 0 :(得分: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
BT异步事情非常混乱。我建议使用async-await。您需要习惯它们,并且您无法完全退出Node回调。尽管如此,他们可能会让事情更清洁。

Plus相关帖子:Why doesn't request.on() work in Node.js - 注意同步/异步执行顺序!一些日志记录可以帮助您了解执行顺序。

节日快乐!

答案 1 :(得分: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);
  }