如果我理解正确,问题似乎是这样的:你想访问
其他模块中的异步函数(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);
});