Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.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 如何在NodeJS Express应用程序的其他位置使用连接_Node.js_Express_Google Api Nodejs Client - Fatal编程技术网

Node.js 如何在NodeJS Express应用程序的其他位置使用连接

Node.js 如何在NodeJS Express应用程序的其他位置使用连接,node.js,express,google-api-nodejs-client,Node.js,Express,Google Api Nodejs Client,我到处都在搜索,我找不到解决我问题的好办法(我认为这更…一般性..我想知道如何以及为什么)。 我使用谷歌pubsub,我的项目中有一项服务。它有两个功能。我需要app.js中的文件并侦听。但我如何在应用程序的其他地方收听?比如说控制器?以下是messageService.ts代码: require('dotenv').config(); const {PubSub} = require('@google-cloud/pubsub'); let messageCount = 0; let pr

我到处都在搜索,我找不到解决我问题的好办法(我认为这更…一般性..我想知道如何以及为什么)。 我使用谷歌pubsub,我的项目中有一项服务。它有两个功能。我需要app.js中的文件并侦听。但我如何在应用程序的其他地方收听?比如说控制器?以下是messageService.ts代码:

require('dotenv').config();
const {PubSub} = require('@google-cloud/pubsub');

let messageCount = 0;

let projectId = 'xxx';
let topicName = 'xxxt';
let subscriptionName = 'xxx';

// Instantiates a client
const pubsub = new PubSub({projectId});

// Creates a new topic
const topic = pubsub.topic(topicName);

const subscription = topic.subscription(subscriptionName);
module.exports = {
    listenForMessages : () => {
        const messageHandler = message => {
            console.log(`Received message ${message.id}:`);
            console.log(`\tAgresso Data: ${message.data}`);
            //console.log(`\tAttributes: ${message.attributes}`);
            messageCount += 1;
            message.ack();
        };
        
        subscription.on('message', messageHandler);
    },
    sendTestMessage : () => {
        let messageObject = {
            action: 'insert',
            objectType: 'resource',
            objectId: 12456,
            stamp: Date.now()
        }
    
        topic.publish(Buffer.from(JSON.stringify(messageObject)));
        console.log('sent test message') ;
    }

}

您的
订阅
常量不一定只能在此文件中使用

我建议您采用不同的方法/架构。其中有一个名为
PubSubConnection.ts
的文件,您可以在其中执行整个PubSub/topic/subscription实例化,并在整个项目中共享它。这样,您就不必每次使用新主题时都重新创建新主题。也许你甚至可以将其分解为任何主题

例如:

app.ts

从“dotenv”导入dotenv;
dotenv.config();
从'@googlecloud/PubSub'导入{PubSub};
从“快递”进口快递;
从“/PubSubConnection”导入PubSubConnection;
从“/listenSub”导入{sendTestMessage};
常量app=express();
//DI(依赖注入)
//创建一个一次性pubsub,因为您肯定只会在应用程序中使用相同的项目id
const pubSub=new pubSub({projectId:process.env.PROJECT_ID});
//在此处或其他任何位置动态创建与主题/订阅的连接
//在di中,您的服务/组件需要访问特定主题/订阅
const pubSubConnection=new pubSubConnection(pubSub,‘您的主题名称’、‘您的主题名称’);
//此成员可以传递到应用程序运行的任何服务
const topic=publisubconnection.getTopic;
const subscription=pubSubConnection.getSubscription;
//并在任何需要的地方使用尽可能多的功能
//只需将已创建的主题/订阅传递给它即可
sendTestMessage(主题);
app.listen(process.env.PORT,()=>{
log('服务器已启动');
});
PubSubConnection.ts

//Dotenv应始终首先加载到应用程序中(在您的情况下称为app.js)和第1行中
//因为它只需要加载一次就可以访问env变量
//无需在需要访问env var的任何地方加载它
//require('dotenv').config();
从'@googlecloud/PubSub'导入{PubSub,Subscription,Topic};
导出默认类TopicSubConnection{
主题:主题
订阅:订阅
建造师(
私有只读pubSub:pubSub,
私有只读主题名称:字符串,
私有只读订阅名称:字符串
) {
this.topic=新主题(this.pubSub,this.topicName);
this.subscription=新订阅(this.pubSub,this.subscriptionName);
}
public get getTopic():主题{
返回此.topic;
}
public get getSubscription():订阅{
退回此订阅;
}
}
子操作

从“@googlecloud/pubsub”导入{订阅、主题、消息};
让messageCount=0;
导出常量listenForMessages=(订阅:订阅):void=>{
const messageHandler=(message:message)=>{
log(`Received message${message.id}:`);
log(`\tAgresso Data:${message.Data}`);
//log(`\t属性:${message.attributes}`);
messageCount+=1;
message.ack();
};
//处理程序可以是一个函数数组,这意味着您可以有不同的
//侦听同一订阅的函数
subscription.on('message',messageHandler);
};
export const sendTestMessage=(主题:topic):void=>{
让messageObject={
操作:“插入”,
objectType:'资源',
目标:12456,
邮票:Date.now()
}
publish(Buffer.from(JSON.stringify(messageObject));
console.log('已发送测试消息')
};

您试图在这些位置要求使用相同的文件吗?这是一种非常糟糕的做法,因为如果您按照它的实现方式这样做,您将在应用程序中创建多个
PubSub
实例副本。加上注册/订阅潜在的相同主题。。