【问题标题】:How to use Node http request globally如何全局使用 Node http 请求
【发布时间】:2016-05-25 02:12:26
【问题描述】:

我知道 Javascript,但对 NodeJS 很陌生。我想在我的代码中的任何地方重用 http 请求server.js 之外。请看:

server.js

var http = require('http'); var mongodb = require('./db'); var settings = require('./settings'); var oauth = require('./oauth'); //启动mongodb连接 mongodb.connect(函数(错误){ 如果(错误)console.error(错误); 别的 { //设置db为mongodb客户端 var db = mongodb.use(); //启动http服务器 http.createServer(函数(请求,响应){ //设置POST正文 request.body = ''; request.on('错误',函数(错误){ 控制台.错误(错误); response.statusCode = 404; response.end(); }).on('数据',函数(块){ request.body += 块; }).on('结束',函数(){ //数据库和http服务器准备好,启动逻辑 //现在我想在这里“要求”一个文件,例如test.js并调用“request.headers”来工作 }); }).listen(settings.httpPort,function(){ console.log('服务器监听'+settings.httpServer+':'+settings.httpPort); }); } });

现在我想要求 test.js 执行以下操作
test.js

console.log(request.headers);

注意:我不想使用 Express 之类的任何框架。我想从头开始写我自己的东西。请帮助我,非常感谢。

【问题讨论】:

标签: node.js


【解决方案1】:

如果我理解正确,问题似乎是这样的:你想访问 其他模块中的异步函数(HTTP 请求)的结果。然而, Node的require()是同步的;没有异步require()。那里 有几个解决方案,如果你知道,这些都不会陌生 JavaScript。

最简单的解决方案是将 server.js 模块包装在一个函数中 回调。然后,一旦请求可用,就调用回调,如下所示:

// server.js
'use strict';

// ...

module.exports = function(callback) {

  // ...

  http.createServer((req, res) => {
    req.body = '';

    // Call end with error on error
    req.on('error', err => res.end(err));

    // Append chunks to body
    req.on('data', chunk => req.body += chunk);

    // Call callback here
    req.on('end', err => {
      // Call with error as first argument on error
      if (err) callback(err);
      // Call with request as second argument on success
      else callback(null, req);
    });

  }).listen(/*...*/);
  // ...
};

在你的 test.js 文件中:

// test.js
'use strict';

const server = require('./server');

// Do something with the request here.
server((err, req) => {
  if (err) console.error(err);
  else console.log(req.headers);
});

这种方法存在问题。每次你想访问 请求,您的服务器功能将重新运行。如果你想跑步怎么办 服务器一次,然后可以根据需要多次访问请求?

考虑为此使用 Node 的 events 模块。在您的 server.js 文件中,您可以 导出 EventEmitter 实例而不是函数。发出适当的事件 在该模块中,然后您可以在需要的任何其他模块中添加侦听器 访问请求。您的 server.js 文件将如下所示:

// server.js
'use strict';

const EventEmitter = require('events');
const emitter = new EventEmitter();

// ...

http.createServer((req, res) => {
  req.body = '';
  req.on('error', err => res.end(err));
  req.on('data', chunk => req.body += chunk);

  // Emit events here:
  req.on('end', err => {
    // Emit 'error' event on error.
    if (err) emitter.emit('error', err);
    // Emit 'data' event on success.
    else emitter.emit('data', req);
  });
}).listen(/*...*/);

// ...

module.exports = emitter;

在你的 test.js 文件中:

// test.js
'use strict';

const server = require('./server');

// Do something on error event.
server.on('error', console.error);

// Do something on data event.
server.on('data', req => {
  console.log(req.headers);
});

【讨论】:

  • 谢谢 McMath,第二个解决方案非常好。现在我想知道这一点,从 server.js 内部我需要 test.js,从 test.js 我需要 server.js。它会导致无休止的循环吗?
  • @ShanRuan 不会造成死循环。节点可以处理cyclic dependencies。但是如果你对 Node.js 中的模块加载方式没有很好的理解,它很容易导致其他问题。如果可以的话,我建议尝试重新考虑你的代码以消除循环依赖。否则,是否会导致问题将取决于您的代码。您可以考虑在本网站上搜索可能对您有帮助的其他问题,或者完全提出一个新问题。
  • 嗨麦克马思。你说这可能会导致其他问题。你能给我一些关于这些问题的例子吗?我是一名多年的 PHP 人,所以 NodeJS 对我来说有很多新东西。非常感谢。
  • @ShanRuan 例如,您可能会发现您需要的模块尚未定义。要知道什么时候可能会发生这种情况,需要很好地理解模块是如何加载的,这就是为什么我建议现在最好尽量避免循环依赖。无论如何,这个话题对于 cmets 部分来说太大了。有关更多详细信息,我建议您在 Google 或 Stack Overflow 上搜索“节点中的循环依赖项”,如果您仍有疑问,可以针对该主题提出新问题。
  • 感谢您的好意
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-16
  • 1970-01-01
  • 1970-01-01
  • 2017-03-28
  • 2019-10-06
  • 2013-04-29
  • 2017-01-02
相关资源
最近更新 更多