Node.js 了解express数据流和回调
我有一个名为weather.js的文件,看起来像这样Node.js 了解express数据流和回调,node.js,express,Node.js,Express,我有一个名为weather.js的文件,看起来像这样 var request = require('request'); var exports = module.exports = {}; exports.getWeather = function (cb){ request('https://api.forecast.io/forecast/apiKey/43.0796,-89.3758', function (error, response, body) { if (
var request = require('request');
var exports = module.exports = {};
exports.getWeather = function (cb){
request('https://api.forecast.io/forecast/apiKey/43.0796,-89.3758', function (error, response, body) {
if (!error && response.statusCode == 200) {
console.log(error);
}
else if(!error && response.statusCode == 200) {
console.log("forcast io response received");
return body;
}
});
};
和express routes文件:
var express = require('express');
var router = express.Router();
var weather = require("../models/weather.js")
/* GET home page. */
router.get('/', function(req, res, next) {
res.render('index', { weather: weather.getWeather() });
});
module.exports = router;
我知道我的getWeather()函数可以工作,因为如果我使用console.log(body),就会打印JSON字符串,但不会在浏览器中呈现。我真正不了解的是异步模式是如何工作的。我认为JSON没有打印出来,因为网页是在函数启动/完成之前呈现的。返回数据后,如何使用回调来呈现api调用中的数据?在此代码中,您不能执行
返回正文
:
var request = require('request');
var exports = module.exports = {};
exports.getWeather = function (cb){
request('https://api.forecast.io/forecast/apiKey/43.0796,-89.3758', function (error, response, body) {
if (error) {
console.log("Error");return;
}
else if(!error && response.statusCode == 200) {
cb(body);
}
});
};
var express = require('express');
var router = express.Router();
var weather = require("../models/weather.js")
/* GET home page. */
router.get('/', function(req, res) {
weather.getWeather(function(body){
res.render('index', { weather: body });
})
});
module.exports = router;
else if(!error && response.statusCode == 200) {
console.log("forcast io response received");
return body;
}
如果使用Promise
,可以编写如下代码:
'use strict';
var exports = module.exports = {};
exports.getWeather = function() {
return Promise(function(resolve, reject) {
request('https://api.forecast.io/forecast/apiKey/43.0796,-89.3758', function (error, res, body) {
if (!error && response.statusCode == 200) {
reject(error);
} else {
console.log("forcast io response received");
resolve(body);
}
}
});
}
var express = require('express');
var router = express.Router();
var weather = require("../models/weather.js")
/* GET home page. */
router.get('/', function(req, res) {
weather
.getWeather()
.then(function(body){
res.render('index', { weather: body });
})
.catch(function(error) {
res.end(error);
});
});
module.exports = router;
如何在第二种方法中访问
res
?是否有必要使用承诺,因为我可以通过上述代码获得结果?如果这是一个愚蠢的问题,我很抱歉,那么为什么在这里使用承诺而不是回调?我会正确地标记这一点,但我在weather.js中得到了“undefined不是承诺”的上述内容。我还没弄明白为什么雪人就知道了。我需要把它改成“回报新的承诺”