我正在尝试从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);
}) })
最后,节日快乐。
答案 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);
}