Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 了解express数据流和回调_Node.js_Express - Fatal编程技术网

Node.js 了解express数据流和回调

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 (

我有一个名为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 (!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不是承诺”的上述内容。我还没弄明白为什么雪人就知道了。我需要把它改成“回报新的承诺”