Nodejs一个问题,请noder帮忙看看

Nodejs一个问题,请noder帮忙看看

代码如下,一个路由件,我通过request发送http请求,将获取的数据赋值给content。

router.get('/路由', function(req, res) {
  var content = '';
  var options = 已经有了;
  request(options, function(err, res, data) {
    if (err) {throw err;}
    content = data;
  });
  //执行下一句话时,request语句还没有返回data,所以失败。。。
  res.send(content);
}

请noder提供几个方案,如何才能实现res.send(content);


6 回复

Node.js 一个问题,请noder帮忙看看

问题描述

你正在编写一个路由处理函数,该函数通过 request 发送 HTTP 请求,并将获取的数据赋值给变量 content。但是,当你尝试在 request 回调之外的代码中使用 content 变量时,发现 request 还没有完成数据获取,导致 content 仍然是空的。

示例代码

const express = require('express');
const request = require('request');

const app = express();
const router = express.Router();

router.get('/路由', function(req, res) {
  var content = '';
  var options = {
    url: 'http://example.com',
    method: 'GET'
  };

  request(options, function(err, response, data) {
    if (err) { throw err; }
    content = data;

    // 在这里发送响应
    res.send(content);
  });

  // 执行下一句话时,request语句还没有返回data,所以失败。。。
  // res.send(content);  // 这里会导致content为空
});

app.use(router);

app.listen(3000, () => {
  console.log('Server is running on port 3000');
});

解决方案

1. 将响应发送放在回调函数内部 这是最简单且直接的方法。确保在 request 完成后才发送响应。如上所示,在 request 的回调函数内部发送响应。

2. 使用 async/await 你可以使用 async/await 来简化异步代码的管理。这可以让你更直观地看到代码的流程。

const express = require('express');
const request = require('request-promise-native'); // 使用 request-promise-native 包

const app = express();
const router = express.Router();

router.get('/路由', async function(req, res) {
  try {
    const options = {
      url: 'http://example.com',
      method: 'GET'
    };

    const data = await request(options);
    res.send(data);
  } catch (err) {
    res.status(500).send(err.message);
  }
});

app.use(router);

app.listen(3000, () => {
  console.log('Server is running on port 3000');
});

在这个例子中,我们使用了 request-promise-native 包,它将 request 转换为一个 Promise。这样可以在 router.get 函数上使用 asyncawait 关键字来处理异步操作,使代码更加简洁易读。

总结

  • 确保在 request 完成后再发送响应。
  • 使用 async/await 可以简化异步代码的管理,使代码更易于理解和维护。

已经找到办法解决了,自己写一个回调函数来实现数据的传递~

欢迎noder提供更好的方法解决~

var content = '';
  var f1 = function(callback) {
    request(options, function(err, res, data) {
      if (err) {throw err;}
      console.log('====' + req.url);
      content = data;
      callback(content);        
    });
  };

var f2 = function(content){ console.log(‘开始调用’); res.send(JSON.parse(content)); }; //下面这句话就执行了这个过程,实现了想要的效果。 f1(f2);

router.get('/路由', function(req, res) {
  var content = '';
  var options = 已经有了;
  request(options, function(err, res, data) {
    if (err) {throw err;}
    content = data;
    //把这一句放到这里如何?
    res.send(content);
  });
}

同意二楼,LZ为何还要绕这么大一圈? 难道其中有深意

这个是express吧?

在你的代码中,request 是一个异步操作。当你调用 res.send(content); 时,request 可能还没有完成,因此 content 还是空的。为了解决这个问题,你需要在 request 完成后再发送响应。

以下是几种可能的解决方案:

解决方案1:在回调函数中发送响应

const express = require('express');
const request = require('request');
const router = express.Router();

router.get('/路由', function(req, res) {
  var options = {}; // 你的 options 对象
  request(options, function(err, response, data) {
    if (err) {
      return res.status(500).send('请求错误');
    }
    res.send(data);
  });
});

module.exports = router;

解决方案2:使用 async/await

如果你希望代码看起来更同步,可以使用 async/await 语法:

const express = require('express');
const request = require('request-promise-native'); // 使用 request-promise-native 包来支持 async/await
const router = express.Router();

router.get('/路由', async function(req, res) {
  try {
    const data = await request(options); // options 是你的请求配置对象
    res.send(data);
  } catch (err) {
    res.status(500).send('请求错误');
  }
});

module.exports = router;

总结

无论采用哪种方式,关键点在于确保在数据准备好之后再发送响应。async/await 语法可以使代码更清晰和易于理解,但基本思路都是在异步操作完成后才发送响应。

希望这些方案能帮到你!

回到顶部